变换光场数据的结果索引是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循环最小化为单行。
答案 0 :(得分:5)
答案是
newLF = LF2;
意思是,该代码除了将LF2
复制到newLF
之外什么都不做。
要检查我是对的,只需让代码运行一些随机矩阵LF2
,然后评估
all(newLF(:) == LF2(:))
你会发现它总是评估为“真实”。
首先,您对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);
相当于
行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]);