私の質問は、MATLABでより速い方法でismember()
が行うことの代替アプローチを見つけることです。ここでMATLABのismember()関数の高速バージョン
は私の問題です:
M [92786253*1] (a: roughly 100M rows)
x [749*1] (b: # of rows can vary from 100 to 10K)
私はa
(の行インデックス)で、存在する共同b
内の行を見つけたいです。 b
の異なるバージョンの場合、この操作を約10M回回繰り返す必要があります。
通常のアプローチ:
tic
ind1 = ismember(M,x);
toc
Elapsed time is 0.515627 seconds.
高速アプローチ:
tic
n = 1;
ind2 = find(any(all(bsxfun(@eq,reshape(x.',1,n,[]),M),2),3));
toc
Error using bsxfun
Requested 92786253x1x749 (64.7GB) array exceeds maximum array size preference.
Creation of arrays greater than this limit may take a long time and cause MATLAB to become unresponsive.
See array size limit or preference panel for more information.
Error in demo_ismember_fast (line 23)
ind2 = find(any(all(bsxfun(@eq,reshape(x.',1,n,[]),M),2),3))
第二のアプローチは、しかし、この場合には、通常、通常より15〜20倍高速であります私はメモリ制限のためにそれを使用することはできません。この操作をスピードアップする方法はありますか?私と専門家の意見を共有してくれてありがとう!
64GbのRAMを購入すると思いますか? :Pこれは非常に大きな問題で、遅くなることを期待する必要があります –
もしそうなら、最初のケースでは何のエラーもありません。私は 'ismember()'を使う以外はこれ以外のトリックがあると思います。 – YAS
そこにどんな制約がありますか? 'M'か' x'のどちらかがソートされていますか? – Divakar