请帮我尽量减少这个循环到单行。
我有一组数据集,表示为4D光场数据。四个指数是u,v,s和t。在数学上,我找到了将这种4D光场数据转换为另一个坐标系的方法。新坐标将是以前系统的3D旋转和翻译版本。
变换光场数据的结果索引是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 :(得分:0)
对图像(或您的情况下的4D数据集)进行坐标转换最好通过逆坐标转换和源数据插值来处理。也就是说,迭代目标像素值,将这些(整数)坐标转换为(小数)源坐标,然后从源数据中查找值,在像素之间进行插值。
所以,你的第一份工作是反转坐标转换。然后,您只需在数据集上调用interpn
,再添加ndgrid生成的源像素位置,再加上已转换的像素位置。