如何在Matlab中选择子矩阵(不是任何特定模式)

如何在Matlab中选择子矩阵(不是任何特定模式),matlab,matrix,matrix-indexing,Matlab,Matrix,Matrix Indexing,如何在Matlab中选择子矩阵(不是任何模式)?例如,对于大小为10 x 10的矩阵,如何选择由第1行、第2行和第9行以及第4列和第6列的交点组成的子矩阵 谢谢你的回答 让我用一个例子来解释: 让我们定义一个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

如何在Matlab中选择子矩阵(不是任何模式)?例如,对于大小为10 x 10的矩阵,如何选择由第1行、第2行和第9行以及第4列和第6列的交点组成的子矩阵


谢谢你的回答

让我用一个例子来解释:

让我们定义一个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
希望这有帮助。

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(:,2:end)
,而不是编写
A([1 2 3],[2 3])
。这对于大型矩阵特别有用

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=[13;12]
,那么
A(I)
与写入
整形(A(I(:))、大小(I))
相同

从矩阵下标转换为线性索引,反之亦然: 为此,您分别拥有和。例如,如果要将矩阵
A
(对应于元素30)中的下标
[1,3]
转换为线性索引,则可以写入
sub2ind(size(A),1,3)
(当然,在这种情况下,结果应该是7)

3.逻辑索引 在逻辑索引中,下标是二进制的,其中逻辑
1
表示选择了相应的元素,而
0
表示未选择相应的元素。下标向量必须与原始矩阵的维数相同,或者是元素数相同的向量。例如,如果我们有:

A = [10 20 30; 40 50 60; 70 80 90];
我们想使用逻辑索引提取
A([13],[12])
,我们可以这样做:

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)
或者这个:

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)
请注意,后两种情况是一维向量,如有必要,应将其重塑为矩阵(例如,使用)


返回矩阵A,删除第i行和第j列

在numpy怎么做?