如何在MATLAB中的单行中实现此功能

-3 optimization matlab

得到的变换光场数据的索引是ub,vb,sb,tb.它们中的每一个都取决于变量u,v,s,t.

很抱歉不清楚,让我提一下,我正在尝试通过某种矩阵转换4D数据集.在下面的代码中,M只是一个3D变换矩阵.

f=0.1; 
n = 11; 
[u,v,s,t] = ndgrid([1:Size(3)],[1:Size(4)],[1:Size(1)],[1:Size(2)]); 
alpha = M(3,1)*s+M(3,2)*t+M(3,3)*nf; 
beta1 = M(1,1)*u+M(1,2)*v+M(1,4); 
beta2 = M(2,1)*u+M(2,2)*v+M(2,4); 
C = M(3,1)*u+M(3,2)*v+M(3,4); 
D1 = M(1,1)*s+M(1,2)*t+M(1,3)*nf; 
D2 = M(2,1)*s+M(2,2)*t+M(2,3)*nf; 
ub = -D1.*C./alpha+beta1; 
vb = -D2.*C./alpha+beta2; 
sb = nf*D1./alpha; 
tb = nf*D2./alpha; 
for s = 1:Size(1) 
    for t = 1:Size(2) 
        for u = 1:Size(3) 
            for v = 1:Size(4)             
                newLF(sb(u,v,s,t),tb(u,v,s,t),ub(u,v,s,t),vb(u,v,s,t)) = LF2(s,t,u,v); 
            end;
        end; 
    end;
end;  
Run Code Online (Sandbox Code Playgroud)

现在由于ub,vb,sb和​​tb依赖于u,v,s,t因此,不可能像newLF = LF2那样分配它;

现在的问题是如何将这些for循环最小化到单行.

A. *_*nda 5

答案是

newLF = LF2;
Run Code Online (Sandbox Code Playgroud)

意思是,该代码除了复制之外什么都不LF2newLF.

要检查我是对的,只需让代码以一些随机矩阵运行LF2然后进行评估

all(newLF(:) == LF2(:))
Run Code Online (Sandbox Code Playgroud)

你会发现它总是评估为"真实".


首先,您的使用sb,tb,ub,vb是多余的.您正在索引到网格,但这只是重现索引.这条线

newLF(sb(u,v,s,t),tb(u,v,s,t),ub(u,v,s,t),vb(u,v,s,t)) = LF2(s,t,u,v);
Run Code Online (Sandbox Code Playgroud)

相当于该行

newLF(s,t,u,v) = LF2(s,t,u,v);
Run Code Online (Sandbox Code Playgroud)

这当然只是元素复制.

Shai指出的排列印象由线条给出

[ub,vb,sb,tb] = ndgrid([1:Size(3)],[1:Size(4)],[1:Size(1)],[1:Size(2)]);
Run Code Online (Sandbox Code Playgroud)

看起来你准备用尺寸(3,4)来置换尺寸(1,2).但是,您在表单中使用此索引网格,sb, tb, ub, vb从中指定值s, t, u, v,因此实际上不会执行排列.


假设你真正想做维度的组合排列,正确的代码会

for s = 1:Size(1)
    for t = 1:Size(2)
        for u = 1:Size(3)
            for v = 1:Size(4)
                newLF(u,v,s,t) = LF2(s,t,u,v);
            end;
        end;
    end;
end;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Shai是正确的,相应的单线是

newLF = permute(LF2, [3 4 1 2]);
Run Code Online (Sandbox Code Playgroud)