如何在MATLAB中的单行中实现此功能(修订版)
请帮我把这个for循环减少到一行 我有一组数据集,表示为4D光场数据。这四个指数是u、v、s和t。从数学上讲,我找到了一种将4D光场数据转换到另一个坐标系的方法。新坐标将是先前系统的三维旋转和平移版本 转换光场数据的结果指数为ub、vb、sb、tb。 它们都取决于变量u、v、s、t 很抱歉不清楚,让我提一下,我正在尝试通过某种矩阵转换4D数据集。在下面的代码中,M只是一个3D变换矩阵如何在MATLAB中的单行中实现此功能(修订版),matlab,optimization,Matlab,Optimization,请帮我把这个for循环减少到一行 我有一组数据集,表示为4D光场数据。这四个指数是u、v、s和t。从数学上讲,我找到了一种将4D光场数据转换到另一个坐标系的方法。新坐标将是先前系统的三维旋转和平移版本 转换光场数据的结果指数为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(
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循环最小化为一条直线。图像(或4D数据集)上的坐标变换最好通过源数据的逆坐标变换和插值来处理。也就是说,迭代目标像素值,将这些(整数)坐标转换为(分数)源坐标,然后从源数据中查找值,在像素之间插值
因此,您的第一项工作是反转坐标变换。然后,您只需在数据集上调用
interpn
,再加上ndgrid生成的源像素位置,再加上转换后的像素位置。在没有数字的情况下运行代码,我不能确定,但是,请在两组输入上尝试sub2ind
。