在MATLAB中加速循环的方法

时间:2011-05-10 08:37:55

标签: matlab performance

我刚刚介绍了我的MATLAB代码,这个for循环有一个瓶颈:

for vert=-down:up
    for horz=-lhs:rhs
        y = y + x(k+vert.*length+horz).*DM(abs(vert).*nu+abs(horz)+1);
    end
end

其中y,x和DM是我已定义的向量。我通过写作来对循环进行了矢量化,

B=(-down:up)'*ones(1,lhs+rhs+1);
C=ones(up+down+1,1)*(-lhs:rhs);
y = sum(sum(x(k+length.*B+C).*DM(abs(B).*nu+abs(C)+1)));

但这最终变慢了。

关于如何加快循环速度,有什么建议吗?

提前致谢。

2 个答案:

答案 0 :(得分:4)

你所做的并不是真正的矢量化。在Matlab中编写适当的图像处理矢量化程序(我假设你正在做的事情)是非常困难的,如果不是不可能的话。当我们使用术语矢量化时,我们的意思是“矢量化而无需额外的计算”。例如,此代码

a = 1:1000000;
for i = a
    n = n+i;
end

比这段代码运行得慢得多

a = 1:1000000;
sum(a)

更新:由于@ Rasman强烈建议,上面的代码已被修改。原因是Matlab在运行之前不会将代码编译到机器语言中,这就是导致它变慢的原因。内置函数如summean.*运算符在后台运行预编译的C代码。 For循环是一个很好的代码示例,如果没有针对CPU的寄存器进行优化,它会慢慢运行。

你做了什么,请忽略我的第一条评论,用向量操作重写你的程序。这些操作需要额外的CPU,因为你告诉你的计算机要做更多的计算,即使每个计算单独可能(或可能不会)花费更少的时间。

如果您真的在加快代码速度,请查看MEX files。它们允许您编写和编译C和C ++代码,编译它并作为Matlab函数运行,就像那些快速内置的代码一样。无论如何,Matlab并不是一个快速的通用编程平台,而是一个计算机模拟环境,尽管这种方法近年来一直在变化。我的建议(来自经验)是,如果你进行图像处理,你将编写for循环,并且很少有办法解决它。向量运算是为了更直观的线性代数问题而编写的,我们很少将数字图像视为常规矩形矩阵,而不是我们用它们做什么。

我希望这会有所帮助。

答案 1 :(得分:0)

我会在处理图像时使用矩阵......然后你可以试着像这样提取子矩阵:

X = reshape(x,height,length);
kx = mod(k,length);
ky = floor(k/length);

xstamp = X( [kx-down:kx+up], [ky-lhs:ky+rhs]);
xstamp = xstamp.*getDMMMask(width, height);
y = sum(xstamp);

...

function mask = getDMMask(width, height, nu)
% I don't get what you're doing there .. return an appropriate sized mask here.
return mask;
end