2

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

4

1 回答 1

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 的分母中减去一个(分别为 counts 和 nrows)。

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

于 2013-07-09T09:31:28.170 回答