4

言う

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]

これを行う単一のステートメント/ベクトル化された方法はありますか?

4

2 に答える 2

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、元の行列から列の1つを選択します。Xの最初の列にはR、の最初の列を使用しますX。の2番目の列には、 (再び)Rの最初の列を使用します。Xの3番目の列には、 ...Rの2番目の列を使用します。X

これの効果は、関心のある要素(で定義されているc)が行列の対角線に沿って配置されることですR。を使用して対角線だけを取得しdiagます。

>>diag(R)

ans =

1
3
6
7
于 2012-05-26T23:26:15.383 に答える
4

sub2indを使用して線形インデックスに変換します

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

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

(以前は正しいサイズでc(:)'入手していました。)c

結果:

res =

 1     4
于 2012-05-26T23:56:14.333 に答える