Matlab为稀疏矩阵分配比所需内存更多的内存

时间:2013-12-03 17:21:11

标签: matlab sparse-matrix

假设我创建了这个稀疏矩阵,其中非零元素由布尔值'true'组成:

  

s =稀疏([3 2        3        3        3        3        2        34        3        6        3        2        3        3        3        3        2        3        3        6],[10235          11470          21211          33322          49297          88361          91470         127422         152383         158751         166485         171471         181211         193321         205548         244609         251470         283673         312384         318752],真实);

包含20个元素。 Matlab应该分配不超过(4 + 4 + 1)* 20 = 180字节的内存(看起来索引长度为4个字节)。然而

  

谁的

说矩阵在内存中占用1275112字节,这是一个问题,因为我需要存储数千个这样的字节。

知道为什么会这样吗?

干杯!

2 个答案:

答案 0 :(得分:5)

MATLAB中稀疏矩阵的存储器存储格式是一个密集的列指针数组。每个列指针指向一个非零元素列表,每个元素都需要一个索引和一个值。所以公式是

(max column num) x P + (num nonzero) x (P + S)

其中P是指针大小(64位系统上为8个字节,32位系统上为4个字节),S是单个元素的大小。 1为逻辑。对于你的问题,我得到1275108,或“足够接近”。

那该怎么办呢?请注意大内存驱动程序:最大列数,因为列指针密集。在您的情况下,如果您反转索引顺序并存储矩阵的转置,它只需要236个字节(在32位系统上)。

答案 1 :(得分:1)

我不知道为什么会这样,但我确实知道如何修复它。这里有一些代码揭示了稀疏矩阵线性地依赖于列数。

for k = 1:6
  n = 10^k; 
  a = sparse(n, 100); % keep number of columns constant
  tmp = whos('a'); 
  fprintf('%1.0f bytes used\n', tmp.bytes); 
end

产生

416 bytes used
416 bytes used
416 bytes used
416 bytes used
416 bytes used
416 bytes used

同时保持行数与a = sparse(n, 100);不变,而不是

     56 bytes used
    416 bytes used
   4016 bytes used
  40016 bytes used
 400016 bytes used
4000016 bytes used

通过交换s的前两个输入来优化您的代码更改34 x 318752318752 x 34sparse矩阵。