Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 每列选择单独的行_Matlab_Octave - Fatal编程技术网

Matlab 每列选择单独的行

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的

我想找到一些方法来做我认为应该做的事情。要将其写入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
的第一列。对于
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