如何在 Matlab 中选择子矩阵(不是任何模式)?例如,对于一个大小为 10×10 的矩阵,如何选择由第 1 行第 2 行和第 9 行以及第 4 列和第 6 列的交集组成的子矩阵?
感谢您提供任何有用的答案!
如何在 Matlab 中选择子矩阵(不是任何模式)?例如,对于一个大小为 10×10 的矩阵,如何选择由第 1 行第 2 行和第 9 行以及第 4 列和第 6 列的交集组成的子矩阵?
感谢您提供任何有用的答案!
至于您的问题,假设您有一个任意的 10×10 矩阵A
。提取所需子矩阵的最简单方法是使用索引向量:
B = A([1 2 9], [4 6]);
官方文档中有一篇有趣的文章全面解释了 MATLAB 中的索引。基本上,有几种方法可以提取值的子集,我将为您总结它们:
索引向量表示要提取的元素的索引。它们可以包含一个或多个索引,如下所示:
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
只是表示该维度中的最后一个索引。例如A([1 2 3], [2 3])
,你可以写而不是写A(:, 2:end)
。这对于大型矩阵特别有用。
线性索引通过将列连接成一个列向量并分别为元素分配索引来将任何矩阵视为列向量。例如,我们有:
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
转换为列向量。
使用矩阵下标进行线性索引:也可以使用另一个矩阵进行线性索引。下标矩阵被简单地转换为列向量,并用于线性索引。然而,生成的矩阵总是与下标矩阵具有相同的维度。
例如, if I = [1 3; 1 2]
, thenA(I)
与 write 相同reshape(A(I(:)), size(I))
。
从矩阵下标转换为线性索引,反之亦然:为此,您分别拥有sub2ind
和ind2sub
。例如,如果要将[1, 3]
矩阵中的下标A
(对应元素30)转换为线性索引,则可以编写sub2ind(size(A), 1, 3)
(这种情况下的结果当然应该是7)。
在逻辑索引中,下标是二进制的,其中逻辑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)
或这个:
I = logical([1 0 1; 1 0 1; 0 0 0]);
B = A(I)
或这个:
I = logical([1 1 0 0 0 0 1 1 0]);
B = A(I)
reshape
请注意,在后两种情况下是一维向量,如有必要(例如,使用),应将其重新整形为矩阵。
让我用一个例子来解释:
让我们定义一个 6x6 矩阵
A = magic(6)
A =
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
从此矩阵中,您需要第 1、2 和 5 行以及第 4 和 6 列中的元素
B = A([1 2 5],[4 6])
B =
26 24
21 25
12 16
希望这可以帮助。
function f = sub(A,i,j)
[m,n] = size(A);
row = 1:m;
col = 1:n;
x = row;
x(i) = [];
y=col;
y(j) = [];
f= A(x,y);
返回矩阵 A,删除第i行和第 j列。