如何在MATLAB中对这些循环进行矢量化并嵌套for循环?

时间:2014-08-06 19:44:19

标签: matlab image-processing vectorization evaluation

我正在尝试对以下代码进行矢量化。我的程序需要很长时间才能执行结果。出于这个原因,我想对我的while循环进行矢量化。是否有可能对其进行矢量化,或者您对我应该做什么有不同的想法?

这里我采用相邻像素的平均值并迭代循环,直到得到近似结果:

n = 500;
Mat_new = rand(n); 
error = 1;
while error > 0.000001
    Mat_Old = Mat_new;
    for i = 2:n-1
        for j = 2:n-1
            Mat_new(i,j) =abs((2+((Mat_Old(i+1,j)+Mat_Old(i-1,j)+Mat_Old(i,j+1)+Mat_Old(i,j-1))))/(4));
        end
    end
    error =max(max(abs(Mat_Old-Mat_new)));
end

1 个答案:

答案 0 :(得分:1)

您所做的实际上是2D矩阵的卷积。您只需指定所需的输入过滤器即可。在您的情况下,您希望找到基本基本方向的加权和:北,东,南,西,给定矩阵中的特定位置作为输出。因此,创建一个包含这些方向的3 x 3过滤器,然后使用imfilterconv2创建输出矩阵。看看你想如何创建一个围绕结果有1个元素边框的图像,我们应该使用conv2代替。虽然你有很多括号(yuck),但你所做的是将基本方向上的所有值加起来,将这个和加上2,取绝对值,然后除以4.

同样,这样做:

n = 500;
Mat_new = rand(n); 
error = 1;
h = [0 1 0; 1 0 1; 0 1 0]; % // Define filter here
while error > 0.000001
    Mat_Old = Mat_new;

    Mat_new = conv2(Mat_Old, h, 'valid');
    Mat_new = abs(Mat_new + 2) / 4; %//Take the output, add 2, absolute then divide by 4
    %// Pad border with zeroes
    Mat_new = padarray(Mat_new, [1 1]);

    error = max(abs(Mat_Old(:) - Mat_new(:))); %// Calculate maximum error
end

上面代码的作用基本上就是你用双for循环做的事情。除了现在,我们正在使用conv2Mat_new的第一行计算矩阵中每个位置的四个基本方向的总和,忽略您在for循环中显示的边框。一旦我们这样做,我们在向每个条目添加2之后通过abs获取矩阵中每个条目的绝对值,然后除以4.之后,我们使用{填充输出矩阵的边界全部为零{3}}。顺便说一下,我重新构建了您的error语句,以便它不会使用max的嵌套调用。我从不喜欢看起来的样子。

不幸的是,while循环(我不认为...)可以进行矢量化。您在每次迭代时计算新输出,并希望计算上一次迭代与当前迭代之间的误差。在这种情况下,没有办法使用强递归关系对这样的东西进行矢量化....所以你现在暂时停留在while循环中。但是,你绝对可以对双for循环进行矢量化,这就是我们刚刚完成的。

这应该有希望达到你想要的效果!