如何在MATLAB中单行实现此功能(修订版)

时间:2015-06-02 07:32:48

标签: matlab optimization

请帮我尽量减少这个循环到单行。

我有一组数据集,表示为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循环最小化为单行。

1 个答案:

答案 0 :(得分:0)

对图像(或您的情况下的4D数据集)进行坐标转换最好通过逆坐标转换和源数据插值来处理。也就是说,迭代目标像素值,将这些(整数)坐标转换为(小数)源坐标,然后从源数据中查找值,在像素之间进行插值。

所以,你的第一份工作是反转坐标转换。然后,您只需在数据集上调用interpn,再添加ndgrid生成的源像素位置,再加上已转换的像素位置。