如何在Matlab中select一个子matrix(不是以任何特定的模式)
如何在Matlab中select一个子matrix(不是任何模式)? 例如,对于10乘10的matrix,如何select由第1行第2行,第9行与第4行,第6列交点组成的子matrix?
感谢您的任何有用的答案!
TLDR:简答
至于你的问题,假设你有一个任意10乘10的matrixA
提取所需子matrix的最简单方法是使用索引向量:
B = A([1 2 9], [4 6]);
在MATLAB中进行索引
在官方文档中有一篇有趣的文章全面地解释了MATLAB中的索引。 基本上,有几种方法来提取一个值的子集,我会为你总结:
1.索引vector
索引向量指示要提取的元素的索引。 它们可以包含一个或多个索引,如下所示:
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)
。 这对于大型matrix特别有用。
2.线性索引
线性索引通过将列连接成一个列向量并分别将索引分配给元素来处理任何matrix,就好像它是列向量一样。 例如,我们有:
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(:)
将任意matrixA
转换成列向量。
带有matrix下标的线性索引 :也可以使用另一个matrix进行线性索引。 下标matrix被简单地转换成列向量,并用于线性索引。 所得到的matrix总是与下标matrix具有相同的尺寸。
例如,如果I = [1 3; 1 2]
I = [1 3; 1 2]
,则A(I)
与书写reshape(A(I(:)), size(I))
相同reshape(A(I(:)), size(I))
。
从matrix下标转换为线性索引,反之亦然 :为此您分别有sub2ind
和ind2sub
。 例如,如果要将matrixA
(对应于元素30)中的下标[1, 3]
转换为线性索引,则可以写入sub2ind(size(A), 1, 3)
(在这种情况下的结果应该当然是7)。
3.逻辑索引
在逻辑索引中,下标是二进制的,其中逻辑1
指示相应元素被select,而0
意味着不是。 下标向量必须与原始matrix具有相同的维度,或者具有相同数量元素的向量。 例如,如果我们有:
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)
请注意,在后两种情况下是一维向量,如果需要,应将其重新整形为matrix(例如,使用reshape
整形)。
我举个例子来解释一下:
我们来定义一个6x6matrix
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
从这个matrix中,你需要第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);
返回matrixA,删除第 i行和第 j列。