2012-03-20 10 views
0

私はMatlabにI(整数)、J(整数)、V(double)の3つのベクトルを持っています。 位置I_i、J_iのi、値V_iの範囲にある行列に割り当てたいと考えています。Matlabで座標セットを割り当てる方法は?

これは可能ですか? 問題は、A(I、J)がベクトル内の要素を照合するのではなく、すべての可能な組み合わせ(I_i、J_j)を参照することです。

+0

質問をより明確に言い換えることができますか?あなたが私以上のものを意味するのは私には分かりません。 –

答えて

2

短い答えはこれです:

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

Indexing in Matlab

私が正しくあなたを理解願っています。

これはMatlabの非常に重要な部分であり、多くの人が「ベクトル演算」関数を使ってコードを複雑にするので、通常のインデックス処理でできること。

1

ACCUMARRAYを使用してみてください:

この場合
M = accumarray([I(:) J(:)], V(:)); 

あなたはIとJの非ユニークな組み合わせを持っている場合、Vの対応する値は、(デフォルトのfunctinが@sumで)一緒に追加されます。異なる動作が必要な場合は、オプション引数として関数をaccumarrayに渡します(documentationを参照)。

0

スパース行列形式を使用しますか? A =疎(...)には、(i、j、値)トリプルをAの非ゼロに強制するために使用できるシグネチャがあります。

私は質問に答えました。

残りの引数は、デフォルトでm:= max(i)、n:= max(j)、nzmax:= length(v)になります。 )、これはあなたが望むと思うものです。

関連する問題