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]

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

最佳答案

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

10-08 16:10