我在Octave中有一个非常大的稀疏矩阵,我希望得到每一行的方差。如果我使用
std(A,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)