Matlab 每列选择单独的行
说 我想找到一些方法来做我认为应该做的事情。要将其写入for循环,请执行以下操作:Matlab 每列选择单独的行,matlab,octave,Matlab,Octave,说 我想找到一些方法来做我认为应该做的事情。要将其写入for循环,请执行以下操作: X = [1 2; 3 4]; c = [1 2]'; 有没有一种语句/矢量化的方法可以做到这一点?diag(X(:,c))应该可以做到这一点 说明: 一个(稍微复杂一点的)例子将有助于理解 for i=1:n res(i) = X(i, c(i)); end % res = [1 4] 这是怎么回事?对于向量c中的每个元素,您将从原始矩阵X中选择一列:对于R的第一列,使用X的第一列。对于R的
X = [1 2;
3 4];
c = [1 2]';
有没有一种语句/矢量化的方法可以做到这一点?diag(X(:,c))
应该可以做到这一点
说明:
一个(稍微复杂一点的)例子将有助于理解
for i=1:n
res(i) = X(i, c(i));
end
% res = [1 4]
这是怎么回事?对于向量c
中的每个元素,您将从原始矩阵X
中选择一列:对于R
的第一列,使用X
的第一列。对于R
的第二列,再次使用X
的第一列。对于R
的第三列,使用X
的第二列。。。等等
这样做的效果是,您感兴趣的元素(在c
中定义)位于矩阵R
的对角线上。使用diag
仅获取对角线:
>>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(:)'
来获得正确大小的c
。)
结果:
X = [1 2;
3 4];
c = [1 2]';
idx = sub2ind(size(X),1:numel(c),c(:)');
res = X(idx);
这仅适用于提供的示例Xodarap,如果
c
不同时等于1:length(X)
,这将不会执行他请求的操作,即检索X(i,c(i))
@guntherstruy它肯定会:X=[1 2 3;4 5 6];c=[31];diag(X(:,c))->[61]
。请注意,我没有对由c
中指定的X
列构成的矩阵执行diag(X)
,而是执行diag
。你说得对,但你能解释为什么吗?我真的不明白X(:,c)
返回给我的是什么。@Xodarap解释补充道。。。如果您需要更多,或者这样做有意义,请告诉我。类似问题:
X = [1 2;
3 4];
c = [1 2]';
idx = sub2ind(size(X),1:numel(c),c(:)');
res = X(idx);
res =
1 4