【问题标题】:Relational operators between big sparse matrices in MatlabMatlab中大稀疏矩阵之间的关系算子
【发布时间】:2018-10-04 08:50:41
【问题描述】:

我在 Matlab 中有两个大的稀疏双矩阵:

  • P,维度为1048576 x 524288

  • I,维度为1048576 x 524288

我想找到i,j这样P(i,j)<=I(i,j)的入口数

我天真地试图运行

 n=sum(sum(P<=I));

但它非常慢(我不得不关闭 Matlab,因为它一直在运行而我无法停止它)。

还有其他更有效的方法可以继续吗?或者我想做的事情不可行?

【问题讨论】:

  • 高度依赖于P&lt;=I的稀疏性。如果它一直都是真的,那么答案是一个“完整的”稀疏矩阵,如果它是一个正常的完整矩阵,它会占用大约 2.5~3 倍的内存。如果这是预期的,也许循环,即使它是逐行的,也是一个更好的主意,因为它使这个操作变慢很可能是需要内存,而不是算术

标签: matlab matrix sparse-matrix


【解决方案1】:

通过一些简单的测试,

n = numel(P) - nnz(P>I);

似乎比sum(sum(P&lt;=I)) 甚至nnz(P&lt;=I) 更快。原因可能是稀疏矩阵P&lt;=I 的非零项比P&gt;I 多,因此需要更多内存。

例子:

>> P = sprand(10485, 52420, 1e-3);
>> I = sprand(10485, 52420, 1e-3);
>> tic, disp(sum(sum(P<=I))); toc
   (1,1)      549074582
Elapsed time is 3.529121 seconds.
>> tic, disp(nnz(P<=I)); toc
   549074582
Elapsed time is 3.538129 seconds.
>> tic, disp(nnz(P<=I)); toc
   549074582
Elapsed time is 3.499927 seconds.
>> tic, disp(numel(P) - nnz(P>I)); toc
   549074582
Elapsed time is 0.010624 seconds.

当然,这在很大程度上取决于矩阵大小和密度。

【讨论】:

  • 哇。非常感谢
【解决方案2】:

这是一个使用非零元素索引的解决方案:

xp = find(P);
xi = find(I);
vp = nonzeros(P);
vi = nonzeros(I);
[s,ia,ib] = intersect(xp,xi);

iia = true(numel(vp),1);
iia(ia)=false;
iib = true(numel(vi),1);
iib(ib) = false;
n = sum(vp(ia) <= vi(ib))+sum(vp(iia)<0)+sum(vi(iib)>0)-(numel(xp)+numel(xi)-numel(s))+numel(P);

【讨论】:

    猜你喜欢
    • 2014-04-18
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多