洛伦谈MATLAB的艺术

将想法转化为MATLAB

见见邻居

MATLAB中的一些计算,包括,例如,计算局部均值或有限差分,或局部应用一些其他滤波器,对相邻的矩阵元素进行运算。在MATLAB的正确条件下,以有效的方式进行运算是很容易的。Steve谈到邻域索引几年前在他的博客上。

目录

线性索引

我说过索引如果你想从不同的角度来阅读这个话题,你可以在前面读很多次。现在,让我提醒你什么是线性索引。

MATLAB按列存储数据。也就是说,每列数据都堆叠在连续内存块中前一列的下方。如果我有这个矩阵A.

A=[1 3 5;2 4 6]
A=1 3 5 2 4 6

我可以通过下标对第一行第二列中的元素进行寻址。

A(1,2)
ans=3

我还可以通过索引来提取这个元素,就像A.严格来说是一个列向量。然后我可以用我们称之为线性索引的方法提取相同的元素。

A(3)
ans=3

有一些函数可以在下标和线性标记之间进行转换sub2indind2sub.

我自己也可以轻松地完成从下标到线性索引的转换。对于二维数组,我只需要知道矩阵有多少行。

nrows=尺寸(A,1)
nrows=2

假设现在我有一个更大的矩阵,我想处理一个给定元素的一些邻居,位于(行、列),对应于线性指数linidx. 只要元素不太靠近矩阵的边缘,我就可以将相邻元素看作是不同方向上的偏移。因此,这个元素南部的邻居对应于(行+1,列),或线性索引术语,linidx+1.

补偿表

下面是4个元素的邻接偏移量表要素而不是在对角线上。

  • S=ind+1
  • N=ind-1
  • E=ind+nrows
  • W=ind nrows

所以你可以很容易地看到对应关系,我创建了一个矩阵,其中的值就是数字1:30排列方式使其在作为一维向量查看时按升序显示。

nrows=5;n柱=6;B=重塑(1:30,nrows,N柱)
B=1 6 11 16 21 26 2 7 12 17 22 27 3 8 13 18 23 28 4 9 19 24 29 5 10 20 25 30

如果我想找到元素的邻居(2,4)(3,2),我可以用矢量化的方式来实现。

linPairs=sub2ind(大小(B),[23],[42])
linPairs=17.8

如果我想要这些点以东,我只需添加nrows.

eastVals=B(linPairs+nrows)
伊斯特瓦尔斯=22 13

小心

一个警告性的评论是,你必须非常确定你不会越过你感兴趣的元素的边界。如果这样做,您将超出数组的边界,或者拾取一个环绕到下一行或下一列的值。如果存在这样的危险,您可能希望在执行相邻操作之前填充初始阵列,然后在完成操作后将填充剥下来。

您的计算是否需要寻址邻居?

你和邻居一起工作有什么经验?让我知道在这里.小心边缘




与MATLAB®7.11一起发布

|
  • 打印
  • 发送电子邮件

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。