如何在MATLAB中实现这一功能

如何在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);

转换光场数据的结果指数为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循环最小化为一行。

答案是

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,事实上,你最好问一个新问题。我真的不希望我最优雅的答案被某些更新所否定不过,说真的,你的新代码看起来比旧代码更混乱。由浮点运算定义的索引?!