私はMatlabにI(整数)、J(整数)、V(double)の3つのベクトルを持っています。 位置I_i、J_iのi、値V_iの範囲にある行列に割り当てたいと考えています。Matlabで座標セットを割り当てる方法は?
これは可能ですか? 問題は、A(I、J)がベクトル内の要素を照合するのではなく、すべての可能な組み合わせ(I_i、J_j)を参照することです。
私はMatlabにI(整数)、J(整数)、V(double)の3つのベクトルを持っています。 位置I_i、J_iのi、値V_iの範囲にある行列に割り当てたいと考えています。Matlabで座標セットを割り当てる方法は?
これは可能ですか? 問題は、A(I、J)がベクトル内の要素を照合するのではなく、すべての可能な組み合わせ(I_i、J_j)を参照することです。
短い答えはこれです:
A(sub2ind(size(A),X,Y)) = V
はそれが魔法のように動作し、それを試してみてください。あなたは好奇心旺盛だし、それをしたい場合は
説明は、従うことは簡単です:
のMatlabのすべての行列は1次元配列、法線ベクトルとして格納されています。
2次元配列は、実際には最初の列のシーケンスとして、次に2番目の列のようにメモリに格納されます。そのため、次元とは無関係に任意のMatlab配列を線形添字で索引付けすることができます。例えば
:
A = [1 4 7;
2 4 8;
3 6 9 ];
が実際として格納されますので、項目にアクセスするために
[1 2 3 4 5 6 7 8 9]
あなたがしなければならないすべては次のとおりです。(J-1)* num_of_columns + I
そのため、A(2,3)はA(8)と同じ、つまりこの場合は8を返します。
sub2ind関数は、行列のサイズを考慮して、「添え字」のリストを線形インデックスに変換します。まさにあなたがしたいことです。
インデックスを手近にして、割り当てを行うのは簡単です。
ドキュメント: sub2ind
私が正しくあなたを理解願っています。
これはMatlabの非常に重要な部分であり、多くの人が「ベクトル演算」関数を使ってコードを複雑にするので、通常のインデックス処理でできること。
ACCUMARRAYを使用してみてください:
この場合M = accumarray([I(:) J(:)], V(:));
あなたはIとJの非ユニークな組み合わせを持っている場合、Vの対応する値は、(デフォルトのfunctinが@sum
で)一緒に追加されます。異なる動作が必要な場合は、オプション引数として関数をaccumarray
に渡します(documentationを参照)。
スパース行列形式を使用しますか? A =疎(...)には、(i、j、値)トリプルをAの非ゼロに強制するために使用できるシグネチャがあります。
私は質問に答えました。
残りの引数は、デフォルトでm:= max(i)、n:= max(j)、nzmax:= length(v)になります。 )、これはあなたが望むと思うものです。
質問をより明確に言い換えることができますか?あなたが私以上のものを意味するのは私には分かりません。 –