4

X = [1 2;
     3 4];
c = [1 2]';

我想找到一些方法来做我认为X(:,c)应该做的事情。将其编写为 for 循环:

for i=1:n
   res(i) = X(i, c(i));
end
% res = [1 4]

是否有一个单一的语句/矢量化方式来做到这一点?

4

2 回答 2

9

diag(X(:,c))应该做的伎俩

说明:一个(稍微复杂一点的)例子将有助于理解。

>>X = [1 2; 3 4; 5 6; 7 8]

X =

     1     2
     3     4
     5     6
     7     8

>> c = [1 1 2 1];
>> R = X(:,c)

R =

     1     1     2     1
     3     3     4     3
     5     5     6     5
     7     7     8     7

那么这里发生了什么?对于 vector 中的每个元素c,您从原始矩阵中选择一列X:对于 的第一列R,使用 的第一列X。对于 的第二列R,使用X(再次)的第一列。对于 的第三列R,使用X... 的第二列,依此类推。

这样做的效果是您感兴趣的元素(在 中定义c)位于矩阵的对角线上R。使用以下方法获取对角线diag

>>diag(R)

ans =

1
3
6
7
于 2012-05-26T23:26:15.383 回答
4

使用sub2ind转换为线性索引

X = [1 2;
     3 4];
c = [1 2]';

idx = sub2ind(size(X),1:numel(c),c(:)');
res = X(idx);

(我曾经c(:)'得到c正确的尺寸。)

结果:

res =

 1     4
于 2012-05-26T23:56:14.333 回答