使用另一个数组的索引从二维数组中提取值(无循环)
Extract values from 2d array with indices from another array (without loops)
我有一个数组 [2; 3]
和一个矩阵 [ 1 3 4 5; 2 4 9 2]
。
现在我想从第一行中提取第二个元素,从第二行中提取第三个元素,从而得到[3 ; 9]
。我设法用循环来完成它,但由于我正在使用更大的数组,所以我想避免这些。
您可以使用 sub2ind
to convert each of the column subscripts (along with their row subscripts) into a linear index 然后使用 that 索引到您的矩阵中。
A = [1 3 4 5; 2 4 9 2];
cols = [2; 3];
% Compute the linear index using sub2ind
inds = sub2ind(size(A), (1:numel(cols)).', cols);
B = A(inds)
% 3
% 9
或者,您可以自己计算线性指数,这将比 sub2ind
更高效
B = A((cols - 1) * size(A, 1) + (1:numel(cols)).');
% 3
% 9
利用diag
函数,您可以获得一个优雅的单行解决方案:
A = [1 3 4 5; 2 4 9 2];
cols = [2; 3];
B = diag(A(:,cols))
% 3
% 9
这是 diag(A(:,cols))
的作用:
A(:,cols)
选择A
列cols
,A(:,cols)
列k
对应cols(k)
列15=], 给出 [3 4; 4 9]
;
diag
returns 这个矩阵的对角元素,因此在位置 k
处返回 A(:,cols)
的第 k
个对角元素,即A(k,cols(k))
.
我有一个数组 [2; 3]
和一个矩阵 [ 1 3 4 5; 2 4 9 2]
。
现在我想从第一行中提取第二个元素,从第二行中提取第三个元素,从而得到[3 ; 9]
。我设法用循环来完成它,但由于我正在使用更大的数组,所以我想避免这些。
您可以使用 sub2ind
to convert each of the column subscripts (along with their row subscripts) into a linear index 然后使用 that 索引到您的矩阵中。
A = [1 3 4 5; 2 4 9 2];
cols = [2; 3];
% Compute the linear index using sub2ind
inds = sub2ind(size(A), (1:numel(cols)).', cols);
B = A(inds)
% 3
% 9
或者,您可以自己计算线性指数,这将比 sub2ind
B = A((cols - 1) * size(A, 1) + (1:numel(cols)).');
% 3
% 9
利用diag
函数,您可以获得一个优雅的单行解决方案:
A = [1 3 4 5; 2 4 9 2];
cols = [2; 3];
B = diag(A(:,cols))
% 3
% 9
这是 diag(A(:,cols))
的作用:
A(:,cols)
选择A
列cols
,A(:,cols)
列k
对应cols(k)
列15=], 给出[3 4; 4 9]
;diag
returns 这个矩阵的对角元素,因此在位置k
处返回A(:,cols)
的第k
个对角元素,即A(k,cols(k))
.