我的问题是关于寻找一种替代方法来以更快的方式在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