说
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]
是否有单一的声明/矢量化方式?
答案 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)
X = [1 2;
3 4];
c = [1 2]';
idx = sub2ind(size(X),1:numel(c),c(:)');
res = X(idx);
(我使用c(:)'
来获取正确大小的c
。)
结果:
res =
1 4