【发布时间】:2017-05-22 07:47:51
【问题描述】:
我有一个数组[2; 3] 和一个矩阵[ 1 3 4 5; 2 4 9 2]。
现在我想从第一行中提取第二个元素,从第二行中提取第三个元素,从而获得[3 ; 9]。我设法通过循环来完成它,但由于我使用的是更大的数组,所以我想避免这些。
【问题讨论】:
我有一个数组[2; 3] 和一个矩阵[ 1 3 4 5; 2 4 9 2]。
现在我想从第一行中提取第二个元素,从第二行中提取第三个元素,从而获得[3 ; 9]。我设法通过循环来完成它,但由于我使用的是更大的数组,所以我想避免这些。
【问题讨论】:
您可以使用 sub2ind 将每个列下标(连同它们的行下标)转换为 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 列对应A 的cols(k) 列,给出[3 4; 4 9];diag 返回此矩阵的对角元素,因此在位置 k 处返回 A(:,cols) 的第 k 对角元素,即 A(k,cols(k))。【讨论】: