我正在尝试在 GNU Octave 中操作稀疏二进制矩阵,它使用的内存比我预期的要多,并且相关的稀疏矩阵函数的行为不像我想要的那样。我看到这个关于在 MATLAB 中高于预期的稀疏矩阵存储的问题,这表明这个矩阵应该消耗更多的内存,但有助于解释(仅)这种情况的一部分。
对于稀疏的二进制矩阵,我想不出任何方法让 Octave不存储值数组(它们总是隐式1
的,因此不需要存储)。这可以做到吗?Octave 似乎总是消耗值数组的内存。
演示这种情况的精简示例:创建随机稀疏矩阵,将其转换为“二进制”:
mys=spones(sprandn(1024,1024,.03)); nnz(mys), whos mys
显示情况。如果创建存储类数组并且所有索引都是32 位(即,spones()
double
TotalStorageSize - rowIndices - columnIndices == NumNonZero*sizeof(double)-- 不必要地存储这些值(所有
1
s 为double
s)超过了这个 3%-sparse 对象消耗的总内存的一半。
在撰写此问题时弄乱了这个(太久)之后,我发现了一些部分解决方法,所以我将“自我回答”(仅)部分问题的连续性(希望如此),但我没有想到对主要问题做出充分的回答:
如何在 Octave 中创建一个有效存储的(“无/隐含值”)二进制矩阵?
存储格式的其他背景如下...
Octave 文档说稀疏矩阵的存储格式使用格式Compressed Sparse Column (CSC)。这似乎意味着存储以下数组(扩展上述 SO answer,使用规范的耶鲁格式 labels
和列主要顺序的调整):
- values (
A
),存储类大小的非零数 (NNZ) 条目; - 行号(
IA
),索引大小的 NNZ 条目(希望int64
但也许int32
); - 每列的开头(
JA
),列数加 1 个索引大小的条目)
在这种情况下,对于仅二进制存储,我希望有一种方法可以完全避免存储数组(A
),但我想不通。