在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索引是如何工作的:
从一个矩阵中提取分散元素需要一个不同风格的索引,这给我们带来了我们下一个话题。
线性索引
什么这个表达式(14)
做什么?
当你使用只有一个下标索引矩阵A, MATLAB对一个,好像它的元素是串在一长列向量,通过连续的列,如:
16 5 9…8 12 1
表达式(14)简单地提取14日隐含列向量的元素。用一个下标索引到一个矩阵以这种方式通常被称为线性索引。
这是矩阵的元素以及它们的线性指标:
每个元素的线性指数左上角所示。
从图中可以看到(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年出版的