matlab怎么实现循环,如何在MATLAB中对这些循环进行矢量化并嵌套for循环?

你在做什么本质上是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循环进行矢量化,这就是我们刚刚完成的.

这应该有希望实现你想要的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值