3

私はフォームの〜500.000行を持つ大きな配列Aを持っています

[ id1  id2  value1  value2  zero  zero ]

A の識別子の一部を含む行を含む別の小さい配列 B (~20.000 行)

[ id1  id2  value3  value4 ]

B の ID のペアはすべて A に存在します。id1 と id2 の値がそれぞれ一致する位置で、B の値を A に更新したいと考えています。新しい配列の (行) 順序は任意です。

例:

A = 1 1  3 5 0 0
    1 2  6 4 0 0
    1 3  3 1 0 0
    2 1  3 8 0 0
    3 4  0 2 0 0

B = 2 1  7 4
    1 1  2 1

譲るべき

C = 1 1  3 5 2 1
    1 2  6 4 0 0
    1 3  3 1 0 0
    2 1  3 8 7 4
    3 4  0 2 0 0

for ループを使用して B の各要素に対して A を反復処理すると、信じられないほど時間がかかります。もっと速い方法があることを願っています。

4

1 に答える 1

3

を使用ismemberして、「id1」と「id2」が一致する行のインデックスを取得し、最後の 2 つの列を の対応する値で更新できBます。

C = A;
[tf, loc] = ismember(B(:, 1:2), A(:, 1:2), 'rows');
C(loc, 5:6) = B(:, 3:4);
于 2013-05-06T08:06:54.083 に答える