言う
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
、元の行列から列の1つを選択します。X
の最初の列にはR
、の最初の列を使用しますX
。の2番目の列には、 (再び)R
の最初の列を使用します。X
の3番目の列には、 ...R
の2番目の列を使用します。X
これの効果は、関心のある要素(で定義されているc
)が行列の対角線に沿って配置されることですR
。を使用して対角線だけを取得しdiag
ます。
>>diag(R)
ans =
1
3
6
7