使用另一个数组的索引从二维数组中提取值(无循环)

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)) 的作用:

  1. A(:,cols)选择AcolsA(:,cols)k对应cols(k)列15=], 给出 [3 4; 4 9];
  2. diag returns 这个矩阵的对角元素,因此在位置 k 处返回 A(:,cols) 的第 k 个对角元素,即A(k,cols(k)).