登录论坛

查看完整版本 : 如何在不使用MATLAB中的循环的情况下将矩阵元素与其相邻元素进行比较?


poster
2019-12-14, 20:13
我在MATLAB中有一个矩阵。我想检查每个元素的4个连接的邻居(左,右,上,下)。如果当前元素小于任何相邻元素,则将其设置为零,否则将保留其值。可以很容易地用循环来完成,但是由于我有成千上万个这样的矩阵,所以它非常昂贵。

在边缘检测之后,您可能将其识别为非极大值抑制。



回答:

一种实现方法是使用图像处理工具箱中 (http://www.mathworks.com/products/image/)的函数NLFILTER (http://www.mathworks.com/help/toolbox/images/ref/nlfilter.html) ,该函数将给 (http://www.mathworks.com/help/toolbox/images/ref/nlfilter.html)定函数应用于矩阵的每个M×N块:

>> A = magic(6) %# A sample matrix A = 35 1 6 26 19 24 3 32 7 21 23 25 31 9 2 22 27 20 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11 >> B = nlfilter(A,[3 3],@(b) b(5)*all(b(5) >= b([2 4 6 8]))) B = 35 0 0 26 0 0 0 32 0 0 0 25 31 0 0 0 27 0 0 0 0 0 0 0 30 0 34 0 0 16 0 36 0 0 18 0 上面的代码定义了一个匿名函数 (http://www.mathworks.com/help/techdoc/matlab_prog/f4-70115.html) ,该函数 (http://www.mathworks.com/help/techdoc/matlab_prog/f4-70115.html)使用线性索引 (http://www.mathworks.com/help/techdoc/math/f1-85462.html#f1-85511)来获取3×3子矩阵b(5)的中心元素,并将其与其4个连接的邻居b([2 4 6 8]) 。中心元素中的值乘以函数ALL (http://www.mathworks.com/help/techdoc/ref/all.html)返回的逻辑结果,当中心元素大于其所有最近邻居时,逻辑结果为1,否则为0。



更多&回答... (https://stackoverflow.com/questions/5042594)