Matlab 中大稀疏矩阵之间的关系运算符
Relational operators between big sparse matrices in Matlab
我在 Matlab 中有两个大的稀疏双矩阵:
P
维度 1048576 x 524288
I
维度为 1048576 x 524288
我想找到入口的数量 i,j
使得 P(i,j)<=I(i,j)
我天真地尝试 运行
n=sum(sum(P<=I));
但它非常慢(我不得不关闭 Matlab,因为它一直处于 运行ning 状态,我无法停止它)。
是否有其他更有效的方式进行或我想做的事情不可行?
通过一些简单的测试,
n = numel(P) - nnz(P>I);
似乎比sum(sum(P<=I))
甚至nnz(P<=I)
都快。原因可能是稀疏矩阵 P<=I
具有比 P>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.
当然这在很大程度上取决于矩阵大小和密度。
这是一个使用非零元素索引的解决方案:
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);
我在 Matlab 中有两个大的稀疏双矩阵:
P
维度1048576 x 524288
I
维度为1048576 x 524288
我想找到入口的数量 i,j
使得 P(i,j)<=I(i,j)
我天真地尝试 运行
n=sum(sum(P<=I));
但它非常慢(我不得不关闭 Matlab,因为它一直处于 运行ning 状态,我无法停止它)。
是否有其他更有效的方式进行或我想做的事情不可行?
通过一些简单的测试,
n = numel(P) - nnz(P>I);
似乎比sum(sum(P<=I))
甚至nnz(P<=I)
都快。原因可能是稀疏矩阵 P<=I
具有比 P>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.
当然这在很大程度上取决于矩阵大小和密度。
这是一个使用非零元素索引的解决方案:
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);