得到的变换光场数据的索引是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循环最小化到单行.
答案是
newLF = LF2;
Run Code Online (Sandbox Code Playgroud)
意思是,该代码除了复制之外什么都不LF2做newLF.
要检查我是对的,只需让代码以一些随机矩阵运行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)