我在 Octave 中有一个非常大的稀疏矩阵,我想获得每行的方差。如果我使用
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);
另外,我不知道您是否要从 vars 的分母(分别是计数和 nrows)中减一。
编辑:纠正了一个错误,该错误每当 A 以全零的行或列结尾时,就会重建错误大小的 Placedmeans 矩阵。此外,只要一列全为零(而之前为 NaN),第一种情况现在就会返回零的平均值/var/std
关于memory - Octave:稀疏矩阵上的 std 内存消耗太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17526574/