TLDR:简答
至于你的问题,假设你有一个任意的 10×10 矩阵A
。提取所需子矩阵的最简单方法是使用索引向量:
B = A([1 2 9], [4 6]);
MATLAB 中的索引
有一个有趣的文章在官方文档中,全面解释了 MATLAB 中的索引。
基本上,有几种方法可以提取值的子集,我将为您总结一下:
1. 索引向量
索引向量指示要提取的元素的索引。它们可以包含单个索引或多个索引,如下所示:
A = [10 20 30 40 50 60 70 80 90]
%# Extracts the third and the ninth element
B = A([3 9]) %# B = [30 90]
可以为每个维度单独指定索引向量,例如:
A = [10 20 30; 40 50 60; 70 80 90];
%# Extract the first and third rows, and the first and second columns
B = A([1 3], [1 2]) %# B = [10 30; 40 60]
还有两个特殊的下标:end
和冒号(:
):
-
end
仅指示该维度中的最后一个索引。
- 冒号只是“1:end”的简写符号。
例如,不要写A([1 2 3], [2 3])
, 你可以写A(:, 2:end)
。这对于大型矩阵特别有用。
2. 线性索引
线性索引通过将列连接成一个列向量并分别为元素分配索引,将任何矩阵视为列向量。例如,我们有:
A = [10 20 30; 40 50 60; 70 80 90];
我们想要计算b = A(2)
。等效列向量为:
A = [10;
40;
70;
20;
50;
80;
30;
60;
90]
因此b
等于 40。
特殊的冒号和end
当然,也允许使用下标。是因为,A(:)
转换任意矩阵A
转化为列向量。
带矩阵下标的线性索引:
也可以使用另一个矩阵进行线性索引。下标矩阵简单地转换为列向量,并用于线性索引。然而,生成的矩阵始终与下标矩阵具有相同的维度。
例如,如果I = [1 3; 1 2]
, then A(I)
和写作一样reshape(A(I(:)), size(I))
.
从矩阵下标转换为线性索引,反之亦然:
为此你有sub2ind and ind2sub, 分别。例如,如果你想转换下标[1, 3]
在矩阵中A
(对应元素30)转化为线性索引,可以写成sub2ind(size(A), 1, 3)
(当然,本例中的结果应该是 7)。
3. 逻辑索引
在逻辑索引中,下标是二进制的,其中逻辑1
表示对应的元素被选中,并且0
意味着它不是。下标向量必须与原始矩阵具有相同的维度或具有相同元素数量的向量。例如,如果我们有:
A = [10 20 30; 40 50 60; 70 80 90];
我们想要提取A([1 3], [1 2])
使用逻辑索引,我们可以这样做:
Ir = logical([1 1 0]);
Ic = logical([1 0 1]);
B = A(Ir, Ic)
or this:
I = logical([1 0 1; 1 0 1; 0 0 0]);
B = A(I)
or this:
I = logical([1 1 0 0 0 0 1 1 0]);
B = A(I)
请注意,在后两种情况下是一维向量,如有必要,应将其重新整形回矩阵(例如,使用reshape).