Matlab中大型稀疏矩阵之间的关系运算符

时间:2018-10-04 08:50:42

标签: matlab matrix sparse-matrix

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

  • P,尺寸为1048576 x 524288

  • I,尺寸为1048576 x 524288

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

天真的我试图跑步

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

但是它非常慢(我不得不关闭Matlab,因为它永远都在运行,而且我无法停止它)。

还有其他更有效的方法进行还是我想做的事不可行?

2 个答案:

答案 0 :(得分:3)

通过一些简单的测试,

public class LongRunningService
{
    public Task RunAsync(CancellationToken token)
    {
        return Task.Factory.StartNew(() =>
            {
                // here goes something long running
                while (!token.IsCancellationRequested)
                {

                }
            },
            TaskCreationOptions.LongRunning);
    }
}

似乎比n = numel(P) - nnz(P>I); 甚至甚至比sum(sum(P<=I))更快。原因可能是稀疏矩阵nnz(P<=I)的非零条目比P<=I多得多,因此需要更多的内存。

示例:

P>I

当然,这很大程度上取决于基质的大小和密度。

答案 1 :(得分: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);