Memory 八度:稀疏矩阵上的std内存太大

Memory 八度:稀疏矩阵上的std内存太大,memory,octave,sparse-matrix,variance,Memory,Octave,Sparse Matrix,Variance,我有一个非常大的八度稀疏矩阵,我想得到每行的方差。如果我使用 std(A,1) 它崩溃是因为内存耗尽。 为什么会这样? 对于稀疏矩阵,方差应该很容易计算,不是吗? 我如何才能做到这一点?如果您只需要每列中非零项的标准偏差,那么您可以执行以下操作: [nrows, ncols] = size(A); counts = sum(spones(A),1); means = sum(A,1) ./ max(counts, 1); [i,j,v] = find(A); v = means(j); pl

我有一个非常大的八度稀疏矩阵,我想得到每行的方差。如果我使用
std(A,1)
它崩溃是因为内存耗尽。
为什么会这样?
对于稀疏矩阵,方差应该很容易计算,不是吗?

我如何才能做到这一点?

如果您只需要每列中非零项的标准偏差,那么您可以执行以下操作:

[nrows, ncols] = size(A);

counts = sum(spones(A),1);

means = sum(A,1) ./ max(counts, 1);
[i,j,v] = find(A);
v = means(j);
placedmeans = sparse(i,j,v,nrows,ncols);

vars = sum((A - placedmeans).^2, 1) ./ max(counts, 1);

stds = sqrt(vars);
我无法想象这样一种情况,即您想要获取稀疏矩阵(包括零)每列中所有项的标准偏差,但如果是这样,您只需要计算每列中的零数量,并将其包括在计算中:

[nrows,ncols] = size(A);

zerocounts = nrows - sum(spones(A),1);

means = sum(A,1) ./ nrows;
[i,j,v] = find(A);
v = means(j);
placedmeans = sparse(i,j,v,nrows,ncols);

vars = (sum((A - placedmeans).^2, 1) + zerocounts .* means.^2) ./ nrows;

stds = sqrt(vars);
另外,我不知道你是否想从变量的分母中减去一(分别是counts和nrows)


编辑:修正了一个错误,每当a以全零的行或列结束时,它会重新构造错误大小的placedmeans矩阵。此外,第一种情况下,当一列为全零时,现在返回的平均值/var/std为零(而在此之前它应该是NaN)

是的,计算稀疏矩阵方差的算法可能非常简单(取决于格式),但必须实现。如何有效地实现它?有没有一种方法可以循环遍历稀疏矩阵的条目?这几乎可以实现,但似乎有一个bug。我需要第二个版本,它也计算零。不幸的是,如果矩阵的末尾包含一整行零,那么它就不起作用了。在这种情况下,它给出了一个关于尺寸的例外。你知道为什么吗?好吧,那是个愚蠢的评论。不能计算一行零的方差。你知道我如何修改上面的代码,使那些没有条目的得到0作为方差吗?你完全可以得到一行零的方差。它是零。(但是,您不能接受空列表的方差,因此在这种情况下,我将第一个版本更改为0)。但是,我提供的代码采用每列的标准偏差(就像std(A,1))一样,而不是每行的标准偏差。此外,我还对您提到的bug进行了修改。它应该适用于任何(非空的)矩阵现在我似乎越来越笨了。我工作过度:-(