如何在MATLAB中实现这一功能
转换光场数据的结果指数为ub、vb、sb、tb。它们都取决于变量u、v、s、t如何在MATLAB中实现这一功能,matlab,optimization,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);
很抱歉不清楚,让我提一下,我正在尝试通过某种矩阵转换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循环最小化为一行。答案是
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);
这当然只是元素复制
注为的排列印象由线条给出
[ub,vb,sb,tb] = ndgrid([1:Size(3)],[1:Size(4)],[1:Size(1)],[1:Size(2)]);
看起来您正在准备将维度(1,2)置换为维度(3,4)。但是,您以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]);
有点不清楚,你是不是想说
newLF=permute(LF2[3 4 1 2])代码>?用文字解释您试图用函数实现什么以及它的输入是什么。因此,请提供一组小样本值和预期结果,以便我们知道我们是否在正确的路径上。否则,您只是在浪费每个人的时间。此代码应位于@Shai中,或位于codegolf.SE;-)我认为你是赢家。。。我用随机数据运行它,得到了相同的答案,即newLF==LF2
。很抱歉不清楚,让我提一下,我正在尝试通过某种矩阵转换4D数据集。f=0.1;n=11;[u,v,s,t]=ndgrid([1:Size(3)],[1:Size(4)],[1:Size(1)],[1:Size(2)];α=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./α+β1;vb=-D2.*C./alpha+beta2;sb=nfD1./alpha;tb=nf*D2./alpha;对于s=1:t=1:Size(1)对于u=1:Size(2)对于v=1:Size(3)对于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);结束;结束;结束;结束;现在,由于ub、vb、sb和tb依赖于u、v、s、t,因此不可能像newLF=LF2那样分配它@UmairMukati,事实上,你最好问一个新问题。我真的不希望我最优雅的答案被某些更新所否定不过,说真的,你的新代码看起来比旧代码更混乱。由浮点运算定义的索引?!