罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

罗兰在MATLAB的艺术已经存档,不会被更新。

见到邻居

例如,MATLAB的一些计算,包括计算当地的手段或有限的差异,或在本地应用一些其他的过滤器,作用于相邻矩阵元素。这样做在一个高效的方式很容易与MATLAB在合适的条件下。史蒂夫谈论邻居索引几年前在他的博客上。

内容

线性索引

我已经讨论过索引以前很多次,如果你想读到的主题从不同的好处而言。现在,让我提醒你什么是线性索引。

MATLAB存储数据列。也就是说,每一列的数据下面堆放前一分之一连续的内存块。如果我有这个矩阵一个

一个= [1 3 5;2 4 6]
一个= 1 3 5 2 4 6

我可以解决元素在第一行,第二列通过下标。

(1、2)
ans = 3

我也可以通过索引提取这个元素一个完全是一个列向量。然后我可以用我们称之为_linear提取相同的元素索引。

(3)
ans = 3

有功能在下标和线性indicies之间进行转换。看一看sub2indind2sub

我也可以做从下标转换到线性指数轻松自己。对于一个二维数组,我只需要知道多少行矩阵。

nrows =大小(1)
nrows = 2

假设现在我有一个大的矩阵,我想解决一些邻居的一个给定的元素,位于(行、列),对应于线性指数linidx。只要矩阵的元素不是一种边缘太近,我可以考虑邻居在不同方向偏移。因此,邻居这个元素对应的南部(行+ 1,列),或线性索引术语中,linidx + 1

表的偏移量

这里有一个邻居表4元素adject补偿元素而不是在对角线上。

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

所以你可以很容易地看到信件,我创建一个数字矩阵值下午1:30安排他们出现在升序当看着一个一维向量。

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

如果我想找邻居元素(2、4)(2)矢量化的方式,我可以这样做。

linPairs = sub2ind(大小(B)、[2 3] 2 [4])
linPairs = 17日8

如果我想要的分东,我简单地添加nrows

eastVals = B (linPairs + nrows)
eastVals = 22日13

谨慎

警示的评论是,你必须非常确定你不会经过优势边界从你感兴趣的元素。如果你这样做,你会出去你的数组的边界或取一个值,缠绕在下一行或列。如果有危险,你可能想要垫初始数组之前做你的邻居操作,然后皮垫后退时完成。

你的计算需要解决的邻居吗?

你与邻居的工作经验是什么?请让我知道在这里。注意边缘




使用MATLAB®7.11发表


  • 打印
  • 发送电子邮件

コメント

コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。