Octave:std对稀疏矩阵太过密集

时间:2013-07-08 12:25:54

标签: memory octave sparse-matrix variance

我在Octave中有一个非常大的稀疏矩阵,我希望得到每一行的方差。如果我使用 std(A,1); 因内存耗尽而崩溃。 为什么是这样? 对于稀疏矩阵,方差应该很容易计算,不是吗? 我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

如果您想要每列中只有非零条目的标准差,那么您可以这样做:

[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);

另外,我不知道你是否想从vars的分母中减去一个(分别为计数和分数)。

编辑:更正了一个错误,当A在所有零的行或列中结束时,该错误会重建错误大小的placementmeans矩阵。此外,第一种情况现在返回平均值/ var / std为零,只要列全为零(而在它之前为NaN)