1

我正在尝试在 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)
-- 不必要地存储这些值(所有1s 为doubles)超过了这个 3%-sparse 对象消耗的总内存的一半。

在撰写此问题时弄乱了这个(太久)之后,我发现了一些部分解决方法,所以我将“自我回答”(仅)部分问题的连续性(希望如此),但我没有想到对主要问题做出充分的回答:

如何在 Octave 中创建一个有效存储的(“无/隐含值”)二进制矩阵?

存储格式的其他背景如下...

Octave 文档说稀疏矩阵的存储格式使用格式Compressed Sparse Column (CSC)。这似乎意味着存储以下数组(扩展上述 SO answer,使用规范的耶鲁格式 labels列主要顺序的调整):

  • values ( A),存储类大小的非零数 (NNZ) 条目;
  • 行号IA),索引大小的 NNZ 条目(希望int64但也许int32);
  • 每列的开头( JA),列数加 1 个索引大小的条目)

在这种情况下,对于仅二进制存储,我希望有一种方法可以完全避免存储数组(A),但我想不通。

4

1 回答 1

1

完全披露:如上所述,在我撰写这个问题时,我发现了一种减少内存使用的解决方法,所以我在这里“自我回答”部分内容,但它仍然不能完全令人满意,所以我仍在寻找更好的实际答案来存储稀疏二进制矩阵,而没有琐碎,臃肿,不必要的值数组...

在这种情况下,要从类似数字的值中获取类似二进制的值并减少内存使用量,请使用由logical(X). 例如,从上面构建,

logicalmys = logical(mys);

创建一个sparse bool matrix, 占用更少的内存(值数组是1 字节logical而不是 8 字节)。double

向信息中添加更多信息whos有助于whos_line_format阐明情况:默认字符串包括 7 个属性中的 5 个(有关更多信息,请参阅文档)。我正在使用格式字符串

whos_line_format(" %a:4; %ln:6; %cs:16:6:1; %rb:12; %lc:8; %e:10; %t:20;\n")

添加“元素”和“类型”(与“类”不同)的显示。

这样,whos mys logicalmys显示类似

 Attr Name            Size      Bytes Class      Elements                 Type
 ==== ====            ====      ===== =====      ========                 ==== 
      mys          1024x1024   391100 double        32250        sparse matrix
      logicalmys   1024x1024   165350 logical       32250   sparse bool matrix

sparse matrix所以这显示了和之间的区别sparse bool matrix。但是,所消耗的总内存logicalmys与实际存储 NNZ 布尔值数组(1 字节)一致——即:

  • totalMemory 减去 rowIndices 减去 columnOffsets 剩下 NNZ 个字节;

在数字上,

  • 165350 - 32250*4 - 1025*4 == 32250.

所以我们仍然存储 32250 个元素,所有这些都是1. 此外,如果您将 - 元素之一设置1为零,则会减少报告的存储空间!玩得开心,请尝试:选择一个非零元素,例如 ,(42,1)然后将它归零:logicalmys(42,1) = 0;然后whos它!

我希望这是正确的,并且这可以为那些可能感兴趣的人澄清一些事情。欢迎评论,更正或实际答案!

于 2014-06-26T19:19:10.830 回答