2017-09-19 7 views
1

Iは2 n-by-1インデックスベクトルabに基づいて論理n-by-nマトリックスAを作成する、A(i,j)番目の要素は1a(i)==b(j)及び場合だけであるように。次のようにこれを行うにはMatlabの:行列の行と列のインデックスの効率的なマッチング

一つの方法は次のとおりです。

a = [1 1 2 3]'; 
    b = [2 3 1 3]'; 
    n = 4; 

    a_mat = repmat(a, [1 n]); 
    b_mat = repmat(b', [n 1]); 

    A = a_mat == b_mat; 

このアプローチの問題はnが大きい場合、それはかなりメモリを集中的になることです。私は巨大なa_matb_mat行列の作成を必要としない、より効率的なアプローチを探しています。

答えて

0

により、MATLABの暗示expensionに(MATLAB R2016b以降が必要です)

あなたは、単に書くことができます。

A = a==b.'; 

BENCHMARK

n = 20000; 
    a = randi([1,100],1,n)'; 
    b = randi([1,100],1,n)'; 
    A = zeros(n,'logical'); 

    % Solution 1 
    tic 
    a_mat = repmat(a, [1 n]); 
    b_mat = repmat(b', [n 1]); 

    A = a_mat == b_mat; 
    toc 

    % Solution 2 
    tic 
    A = bsxfun(@eq, a, b'); 
    toc 

    % Solution 3 
    tic 
    A = a==b'; 
    toc 

Elapsed time is 24.357663 seconds. 
Elapsed time is 2.497311 seconds. 
Elapsed time is 2.120866 seconds. 

メモリ使用量に関しては、解決策2と3は非常に似ているはずです。行列のサイズを小さくするために、計算がsparse(A)で完了したら行列をスパースすることもできます。

+0

わかりましたので、私は暗黙の拡張が機能するかどうか疑問に思っていました。残念ながら私はまだ2016aでまだまだ立ち往生しています... – Bob

0

は大丈夫、ちょうどそれが実際にはかなり些細だ、答えを自分自身を発見した(残したり、単に質問を削除するかどうかわからない?):

A = bsxfun(@eq, a, b'); 
+0

わかりません。しかし、値が複雑な場合は ''で ''を置き換えてください。 –

+1

私の場合は唯一のインデックス(自然数)ですが、一般的にはそうです! (その場合は、おそらくマッチングの許容範囲を指定する必要があります) – Bob

関連する問題