技术文章和通讯

在MATLAB矩阵索引

史蒂夫·埃丁·罗兰美国舒尔,MathWorks


索引到一个矩阵是一种选择矩阵元素的一个子集。MATLAB®有几个索引不仅功能强大且灵活的风格,但也可读的和富有表现力。索引是一个关键的有效性MATLAB在捕捉matrix-oriented思想可以理解的计算机程序。

索引也密切相关的另一个术语MATLAB用户经常听到:向量化。向量化方法使用MATLAB语言结构来消除程序循环,通常导致程序运行得更快,更具可读性。许多可能的向量化技术,许多依靠MATLAB索引方法,五是本文中描述的。

索引向量

让我们从简单的开始一个向量和一个下标。向量:

v = [16 5 9 4 2 11 7 14];

下标可以是一个单一的值:

v(3) %提取第三个元素ans = 9

或下标可以本身是另一个向量:

v([1 5 6]) %提取第一、第五和第六元素ans = 16 2 11

冒号在MATLAB符号提供了一种简便的方法来提取一系列从v元素:

v(3:7) %提取第三通过ans = 9 4 2 11 7七元素

交换的两半v,使一个新的向量:

v2 = v([8 1:4]) %提取和交换v的半v2 = 2 11 7 14 16 5 9 4

特殊的结束运营商是指一个简单的速记方法v的最后一个元素:

v(结束)%提取最后一个元素ans = 14

结束操作员可以使用范围:

v(5:结束)%提取第五通过ans = 2 11 7 14最后一个元素

你甚至可以做算术结束:

v (2: end-1) %提取第二个通过倒数第二元素ans 11 = 5 9 4 2 7

结合结肠和运营商结束达到不同的效果,比如提取每个k元素或翻转整个向量:

v(1:2) %提取所有奇怪的元素ans = 16 9 2 7 v(结束:1:1)%逆元素的顺序ans = 14 7 11 2 4 9 5 16

通过使用一个索引表达式等号的左边,你可以取代某些元素的向量:

v([2 3 4]) = 15 20[10] %替代的一些元素v v = 16 10 15 20 2 11 7 14

通常在右边的元素数量必须相同的元素的个数称为索引表达式左边。然而,你可以使用标量右侧:

3 v([2]) = 30%取代第二和第三元素20 30 v = 16 30 30 2 11 7 14

这种形式的索引分配标量扩张

用两个下标索引矩阵

现在考虑索引矩阵。我们将使用一个幻方为我们的实验:

=魔法(4)= 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1

通常,索引矩阵使用两个subscripts-one行和列。最简单的形式只是挑出单个元素:

(2、4)%提取元素在第二行,列4 ans = 8

更普遍的是,一个或两个行和列下标可以向量:

ans (2:4, 1:2) = 5 11 9 7 4 14

一个单一的:在一个下标位置是速记符号1:结束和通常用于选择整行或列:

(3:)%提取第三行ans = 9 7 6 12(:,) %提取最后一列ans = 13 8 12 1

经常混乱如何选择分散元素从一个矩阵。例如,假设您想提取(2,1),(2)和(4,4)元素的表达式([2 3 4],[1 2 4])不会做你想做的事情。这个图表说明了two-subscript索引是如何工作的:

two_subscript_indexing.gif

从一个矩阵中提取分散元素需要一个不同风格的索引,这给我们带来了我们下一个话题。

线性索引

什么这个表达式(14)做什么?

当你使用只有一个下标索引矩阵A, MATLAB对一个,好像它的元素是串在一长列向量,通过连续的列,如:

16 5 9…8 12 1

表达式(14)简单地提取14日隐含列向量的元素。用一个下标索引到一个矩阵以这种方式通常被称为线性索引

这是矩阵的元素以及它们的线性指标:

matrix_with_linear_indices.gif

每个元素的线性指数左上角所示。

从图中可以看到(14)是一样的(2、4)

一个下标可以是一个向量包含不止一个线性指数,如:

ans (12 15 [6]) = 11 15 12

考虑再次提取的问题(2,1),(2),和(4,4)答:您可以使用线性索引的元素提取这些元素:

ans ((2 7 16)) = 5 7 1

很容易看到对于这个示例,但是如何计算线性指数一般?MATLAB调用提供了一个函数sub2ind从行和列下标转换到线性指标。你可以用它来提取所需的元素:

idx = sub2ind(大小(A), [2 3 4], [1 2 4]) ans = 2 7 16 (idx) ans = 5 7 1

先进的例子使用线性索引

示例1:将一个矩阵的行

MATLAB的用户最近提出了这个问题comp.soft-sys.matlab新闻组:如果我想转变一个m×n的矩阵的行一个通过k的地方,我用(:,(n - k + 1: n 1: n - k))。但是,如果k是一个函数的行号?也就是说,如果k是一个向量的长度吗?有一个快速和简单的方法来做呢?

常规新闻组贡献者彼得Acklam公布这个解决方案使用sub2ind和线性索引:

%索引向量行和列p = 1: m;q = 1: n;%指数矩阵的行和列(P, Q) = ndgrid (P, Q);%值创建一个矩阵转变K = repmat (K (:), n [1]);%更新矩阵的列索引Q = 1 +国防部(Q + K, n);%创建矩阵的线性索引印第安纳= sub2ind (n [m], P, Q);%最后,创建输出矩阵B =(印第安纳州);

示例2:设置一个矩阵元素为零

另一个MATLAB用户发布了这个问题:我想获得最大的每一行,这并不是一个真正的问题,但后来我想设置所有其他元素为零。例如,这个矩阵:

1 2 3 4 5 5 5 6 7 8 9 3

应该成为:

0 0 0 4 0 0 6 0 0 9 0 0

另一个常规新闻组贡献者,Brett Shoelson提供这紧凑的解决方案。

[Y,我]= max ([], 2);B = 0(大小(A));B (sub2ind(大小(A), 1:长度(我),我))= Y;

逻辑索引

另一个索引的变化,逻辑索引,已经被证明是有用的、更有表现力。在逻辑索引,您可以使用一个逻辑矩阵的数组下标。MATLAB提取矩阵元素对应的非零值逻辑数组。输出是总是一个列向量的形式。例如,(> 12)提取的所有元素一个超过12。

ans (> 12) = 16 14 15 13

许多MATLAB函数返回逻辑逻辑索引数组和非常有用的。例如,您可以取代所有的数组中元素与另一个值通过结合使用isnan、逻辑索引和标量扩张。将所有矩阵的元素B零,使用

B (isnan (B)) = 0

或者你可以替换字符串中的所有空间矩阵str用下划线。

str (isspace (str)) = ' _ '

逻辑索引密切相关找到函数。表达式(> 5)相当于(查找(> 5))。您使用哪个形式主要是风格和你的代码的可读性,但这也取决于你是否需要别的实际索引值的计算。例如,假设你想暂时代替与零值,执行一些计算,然后把值回到原来的位置。在这个例子中,计算二维滤波使用filter2。你这样做:

nan_locations =找到(isnan (A));(nan_locations) = 0;A = filter2 ((3、3), A);(nan_locations) =南;

我们希望本文中的MATLAB索引变量说明给你感觉方法可以表达算法简洁和高效。包括这些技术和相关功能在MATLAB编程曲目扩展你的能力创造出色的,可读,和向量化代码。

2001年出版的

下载188bet金宝搏产品使用

查看相关文章的能力