如何在Matlab中选择一个子矩阵(没有特定的模式)

17
如何在Matlab中选择一个子矩阵(非任何模式)?例如,对于一个大小为10乘10的矩阵,如何选择由第1、2和9行以及第4和6列的交集组成的子矩阵?
谢谢任何有帮助的答案!
3个回答

42

简短回答

关于你的问题,假设你有一个任意的10x10矩阵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],则 A(I) 与写成 reshape(A(I(:)), size(I)) 相同。

从矩阵下标转换为线性索引以及反之: 对于此操作,您可以分别使用sub2indind2sub。例如,如果您想将矩阵A中的下标[1, 3](对应元素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)

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

请注意,在后两种情况下,vector是一个一维向量,如果需要,应该将其重新调整为矩阵(例如,使用reshape)。

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

你需要从这个矩阵中选取第1、2和5行的元素,以及第4和第6列的元素。

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

B = 

26    24
21    25
12    16

希望这能有所帮助。


2
如何在numpy中实现? - linello

0
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列被删除。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接