我的問題是關於尋找一種替代方法來以更快的方式在MATLAB中執行什麼ismember()
。MATLAB中的ismember()函數的快速版本
這裏是我的問題:
M [92786253*1] (a: roughly 100M rows)
x [749*1] (b: # of rows can vary from 100 to 10K)
我想找到b
行是共同存在於a
(的行索引)。 對於不同版本的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