4

ベクトルがあるとしましょう:

b = [3, 2, 1];

次のような行列もあるとしましょう。

A = ones([10 10 10]);

bvectorを座標のソースとして使用して、値を matrix に割り当てたいと考えていますA。この例では、次と同等になります。

A(3, 2, 1) = 5;

MALTAB でベクトルを行列にインデックスを付けるための座標のソースとして使用する簡単な方法はありますか?

4

2 に答える 2

4

ベクトル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

于 2013-05-19T16:12:31.297 に答える
3

それを行う簡単な方法は次のとおりです。

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;
于 2013-05-19T16:11:52.197 に答える