Matlab阵列操作优化

时间:2014-04-18 14:19:32

标签: arrays matlab optimization

在MATLAB程序中,我多次(超过300万)调用一个函数,该函数从局部坐标转换为图像中的全局坐标,这只是一个简单的转换。我的整个代码需要6分钟才能运行,坐标转换功能需要20%的时间。

如何优化此代码?

function LMP_glb = do(pnt_val,LMP,NP_glb)

    NP_co = ones(1,3)*round(pnt_val+1); 
    LMP_glb = [NP_glb(1:3) + LMP(1:3) - NP_co(1:3)]; %basic operations

end

注意:此函数是从我的代码中的其他几个函数调用的(不是在一个无限循环中)。

谢谢。

2 个答案:

答案 0 :(得分:0)

你可以更简单一点:

function LMP_glb = do(pnt_val,LMP,NP_glb)

    LMP_glb = NP_glb(1:3) + LMP(1:3) - round(pnt_val+1);

end

因为MATLAB会处理将表达式的最后一部分从标量扩展到数组。

我看不出太多优化它的方法,因为它没有做太多。如果您要内联这个(即将表达式直接放在代码中而不是作为函数调用它),您还可以节省函数调用开销所需的时间 - 如果有300万次调用,那可能很贵。

@CitizenInsane的建议也是一个很好的建议 - 如果可以一次预先计算所有坐标的这个函数,然后再使用它们,那么可以对操作进行矢量化以获得额外的加速。

最后,有可能(如果你对一点C感到满意),在C中实现这个功能,编译它,并将其称为MEX函数。这可能会或可能不会更快 - 您需要尝试一下。

答案 1 :(得分:0)

我猜你的函数是在某种 for 循环中调用的。如果你的for循环没有数据相互依赖,你只需将其改为 parfor ,Matlab将启动并行池以利用多核处理器,即并行计算。即使你的数据在for循环中交错,你也可以做一些技巧来摆脱它(声明加法矩阵,数组来保存数据结构的另一个副本,交换内存使用速度)。

如Sam所述,您可以使用C / C ++重写函数,通过Matlab编译器编译,并直接调用编译的MEX函数。根据我的经验,对于简单的算术,C / C ++ MEX函数比Matlab更快。

Parfor指南: http://www.mathworks.com/help/distcomp/getting-started-with-parfor.html

MEX示例: http://www.mathworks.com/help/matlab/matlab_external/standalone-example.html