如何在这个Matlab代码中避免for循环?

时间:2018-05-07 17:27:54

标签: matlab performance for-loop

我试图在Matlab中对2D对象执行高斯平滑处理。这是我的代码的精简版

[m,n] = size(object);
area = m*n;
x = [1:m]; y = [1:n]; [x,y] = meshgrid(x,y);
z = zeros(size(x));
for i = 1:m,
    for j = 1:n,
        z = z + object(i,j)*exp(-((x-i).*(x-i) + (y-j).*(y-j)));
    end
end
z = z/area;

此代码运行良好,但对于大型输入矩阵来说非常慢。我想知道是否有办法通过避免for循环来加快速度?我试过想办法加快速度,但我似乎无法找出有用的东西。

1 个答案:

答案 0 :(得分:0)

这里有一个没有循环的矢量化形式。但它使用了更多的内存,并且取决于机器可能比循环慢。但是,大部分计算时间用于计算不依赖于图像的变量“内核”。因此,如果您需要处理许多相同大小的图像,则只需计算一次,然后就可以节省大量时间。我先在这里重复你的代码,因为我修复了x,y,m,n

的混合
xi=bsxfun(@minus,repmat(x(:),1,area),x(:)');
yj=bsxfun(@minus,repmat(y(:),1,area),y(:)');
kernel=exp(-(xi.^2 + yj.^2));
w=kernel*object(:);
w=reshape(w,[m,n])/area;

这是第一个矢量化形式

xx=repmat(x(:),1,area);
yy=repmat(y(:),1,area);
xx=xx-xx';
yy=yy-yy';
kernel=exp(-(xx.^2 + yy.^2));
w=kernel*object(:);
w=reshape(w,[m,n])/area;

另一种不使用bsxfun

的形式