你在做什么本质上是2D矩阵的卷积.您只需指定所需的输入过滤器即可.在您的情况下,您希望找到基本基本方向的加权和:北,东,南,西,给定矩阵中的特定位置作为输出.因此,创建一个包含这些方向的3 x 3过滤器,然后使用
imfilter或
conv2创建输出矩阵.看看你想如何创建一个围绕结果有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
上面代码的作用基本上就是你用double for循环做的.除了现在,我们正在使用conv2. Mat_new的第一行计算矩阵中每个位置的四个基本方向的总和,忽略你在for循环中显示的边界.一旦我们这样做,我们在每个条目加2之后通过abs获取矩阵中每个条目的绝对值,然后除以4.之后,我们使用padarray将所有零填充输出矩阵的边界.顺便说一下,我重构了你的错误语句,以便它不使用嵌套调用max.我从不喜欢看起来的样子.
不幸的是,while循环(我不认为……)可以进行矢量化.您在每次迭代时计算新输出,并希望计算上一次迭代与当前迭代之间的误差.在这种情况下,没有办法使用强递归关系对这样的东西进行矢量化….所以你现在仍然坚持使用while循环.但是,你绝对可以对double for循环进行矢量化,这就是我们刚刚完成的.
这应该有希望实现你想要的!