1

行列Rの値に従って、行列Mの要素を配列dに合計したいと思います。

理論的には、1 つの配列 (D) に合計するアクションには同じデータへのメモリ アクセスが必要なため、シリアル化できません。

私は次の方法でそれを実装しました

for ind = 1: numel(R)
    d(R(ind)) = d(R(ind)) + M(ind);      
end 

@Andrew がこの関連トピックで提案したように: How do I iterate through each element in a n-dimensional matrix in MATLAB?

配列 R の要素はすべて大きいわけではありませんが、1 または 2 ではなく、たとえば 1 から 15 の場合もあります。

アクションの「理論的な複雑さ」が悪化したとしても、Matlabでそれを行うより効率的な方法はありますか?

R の可能な値を反復処理し、 R = val のインデックスで M の要素を合計することによっても解決できるため、一般的に言えばループが「好き」ではない、Matlab の「組み込み」以上のもの。

たとえばSQLでは、1つの列の繰り返しを折りたたんで、他の列の値の合計を取得する「組み込み」メソッドがあります。

同様のアクションについてのトピックがありますが、言語が異なります: マトリックスを折りたたんで、ある列の値を別の列の値で合計します

4

2 に答える 2

2

accumarrayこれは、Matlab の関数を使用して実行できる可能性があります。このようなもの:

d = accumarray(R, M, expected_size_of_d)

ただし、正確な解は行列の形状、つまり線形インデックスを使用するかどうかに依存する可能性があるためM、 とRおよび の期待値の例を示すと便利です ...d

于 2013-09-16T12:44:10.013 に答える
0

あなたの質問はあまり明確ではありません。の選択された要素を合計したい場合M、選択は によって与えられR、次のように行うことができます:

dsum(M(sub2ind(size(M),R(:,1),R(:,2))))

たとえば、

M = [1 2 3;
     4 5 6;
     7 8 9];

R = [1 1; 3 1; 2 2]; % each row selects an element of M

結果は、M(1,1) + M(3,1) + M(2,2) になります。

>> sum(M(sub2ind(size(M),R(:,1),R(:,2))))
ans =
    13
于 2013-09-16T14:26:43.590 に答える