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

v32*_*v32 17 matlab matrix matrix-indexing

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

谢谢你的任何有用的答案!

Eit*_*n T 41

TLDR:简答

至于你的问题,假设你有一个10×10的任意矩阵A.提取所需子矩阵的最简单方法是使用索引向量:

B = A([1 2 9], [4 6]);
Run Code Online (Sandbox Code Playgroud)


在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]
Run Code Online (Sandbox Code Playgroud)

可以分别为每个维度指定索引向量,例如:

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]
Run Code Online (Sandbox Code Playgroud)

还有两个特殊的下标:end冒号(:):

  • end 只是表示该维度中的最后一个索引.
  • 冒号只是"1:end"的简写符号.

例如,A([1 2 3], [2 3])你可以写,而不是写A(:, 2:end).这对于大型矩阵特别有用.

2.线性索引

线性索引通过将列连接成一个列向量并分别为元素分配索引,将任何矩阵视为列向量.例如,我们有:

A = [10 20 30; 40 50 60; 70 80 90];
Run Code Online (Sandbox Code Playgroud)

我们想要计算b = A(2).等效列向量是:

A = [10;
     40;
     70;
     20;
     50;
     80;
     30;
     60;
     90]
Run Code Online (Sandbox Code Playgroud)

因此b等于40.

end当然,也允许特殊的冒号和下标.因此,A(:)将任何矩阵A转换为列向量.

使用矩阵下标的线性索引:也可以使用另一个矩阵进行线性索引.下标矩阵简单地转换为列向量,并用于线性索引.然而,所得到的矩阵总是与下标矩阵具有相同的尺寸.
例如,if I = [1 3; 1 2],则A(I)与写作相同reshape(A(I(:)), size(I)).

从矩阵下标转换为线性索引,反之亦然:为此您分别拥有sub2indind2sub.例如,如果要将[1, 3]矩阵中的下标A(对应于元素30)转换为线性索引,则可以编写sub2ind(size(A), 1, 3)(当然,本例中的结果应为7).

3.逻辑索引

在逻辑索引中,下标是二进制的,其中逻辑1表示选择了相应的元素,并且0意味着它不是.下标向量必须与原始矩阵具有相同的维度,或者具有相同数量的元素.例如,如果我们有:

A = [10 20 30; 40 50 60; 70 80 90];
Run Code Online (Sandbox Code Playgroud)

我们想要A([1 3], [1 2])使用逻辑索引进行提取,我们可以这样做:

Ir = logical([1 1 0]);
Ic = logical([1 0 1]);
B = A(Ir, Ic)
Run Code Online (Sandbox Code Playgroud)

或这个:

I = logical([1 0 1; 1 0 1; 0 0 0]);
B = A(I)
Run Code Online (Sandbox Code Playgroud)

或这个:

I = logical([1 1 0 0 0 0 1 1 0]);
B = A(I)
Run Code Online (Sandbox Code Playgroud)

注意,后两种情况是一维向量,如果需要,应该重新形成一个矩阵(例如,使用reshape).


R. *_*ini 13

让我用一个例子来解释一下:

让我们定义一个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
Run Code Online (Sandbox Code Playgroud)

从此矩阵中,您需要第1,2和5行以及第4和第6列中的元素

B = A([1 2 5],[4 6])

B = 

26    24
21    25
12    16
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 如何在numpy中做到这一点? (2认同)