每列选择单独的行

时间:2012-05-26 23:23:20

标签: matlab octave

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]

是否有单一的声明/矢量化方式?

2 个答案:

答案 0 :(得分: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

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

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

>>diag(R)

ans =

1
3
6
7

答案 1 :(得分:4)

使用sub2ind转换为linear indices

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

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

(我使用c(:)'来获取正确大小的c。)

结果:

res =

 1     4