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

时间:2015-06-01 12:12:10

标签: matlab optimization

变换光场数据的结果索引是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;  

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

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

1 个答案:

答案 0 :(得分:5)

答案是

newLF = LF2;

意思是,该代码除了将LF2复制到newLF之外什么都不做。

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

all(newLF(:) == LF2(:))

你会发现它总是评估为“真实”。

首先,您对sbtbubvb的使用是多余的。您正在索引到网格,但这只是重现索引。这条线

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);

相当于

newLF(s,t,u,v) = LF2(s,t,u,v);

这当然只是元素复制。

Shai注明的排列的印象由行

给出
[ub,vb,sb,tb] = ndgrid([1:Size(3)],[1:Size(4)],[1:Size(1)],[1:Size(2)]);

看起来你准备用尺寸(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;

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

newLF = permute(LF2, [3 4 1 2]);