memory - Octave:稀疏矩阵上的 std 内存消耗太大

标签 memory octave sparse-matrix variance

我在 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/

相关文章:

matlab - Octave生成组合子集

java - 如果 ArrayMap 或 SparseArray 中的键散列存在冲突怎么办?

c# - 访问 LTO 磁带内存的源代码 (C/C#)

c++ - 从十六进制转换为 LPCVOID 切断了地址的一半

octave - 查找 Octave 四元数的向量部分

callback - 使用回调来识别 3D 绘图上的鼠标选定点,有时只能在另一个 m 文件中作为函数使用,为什么?

python - 了解 csr 格式

pytorch - 如何在pytorch中按元素将稠密矩阵乘以稀疏矩阵

c++ - 就地数据操作

memory - 对于 n>1 的 n 元语法,Stanford-nlp 分类器内存不足