假设我创建了这个稀疏矩阵,其中非零元素由布尔值'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字节,这是一个问题,因为我需要存储数千个这样的字节。
知道为什么会这样吗?
干杯!
答案 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 318752
从318752 x 34
到sparse
矩阵。