ベクトルがあるとしましょう:
b = [3, 2, 1];
次のような行列もあるとしましょう。
A = ones([10 10 10]);
b
vectorを座標のソースとして使用して、値を matrix に割り当てたいと考えていますA
。この例では、次と同等になります。
A(3, 2, 1) = 5;
MALTAB でベクトルを行列にインデックスを付けるための座標のソースとして使用する簡単な方法はありますか?
ベクトルがあるとしましょう:
b = [3, 2, 1];
次のような行列もあるとしましょう。
A = ones([10 10 10]);
b
vectorを座標のソースとして使用して、値を matrix に割り当てたいと考えていますA
。この例では、次と同等になります。
A(3, 2, 1) = 5;
MALTAB でベクトルを行列にインデックスを付けるための座標のソースとして使用する簡単な方法はありますか?
ベクトルb
を cell 配列に変換することでこれを行うことができます。
B = num2cell(b);
A(B{:}) = 5;
2 行目はコンマ区切りの listB
に展開され、 の各要素が個別の配列インデックスとして渡されます。B
複数のポイントの座標が含まれている場合b
(各行は 1 つのポイントを表します)、ソリューションを次のように一般化できます。
B = mat2cell(b, size(b, 1), ones(1, size(b, 2)));
A(sub2ind(size(a), B{:}))
b
これは cell 配列に変換され、各セルには同じ次元のすべての座標が含まれています。では、必要な結果が得られないことに注意してくださいA(B{:})
(代わりに、これにより、左上座標と右下座標の間のすべての要素が選択されます) sub2ind
。
それを行う簡単な方法は次のとおりです。
A(b(1), b(2), b(3)) = 5;
もう 1 つの方法は、 function と同様に、座標を線形インデックスに変換することですsub2ind
。
idx = [1, cumprod(size(A))] * [b(:) - 1; 0] + 1;
A(idx) = 5;
この解は、複数の点に対してさらに拡張できます。その座標は の行に格納され、b
ベクトルvals
に割り当てられた値は、長さが の行の数に等しくなりますb
。
idx = [1, cumprod(siz(2:end))] * (reshape(b, [], ndims(A)) - 1)' + 1;
A(idx) = vals;