在Matlab中创建稀疏矩阵时,似乎可以创建一个填充逻辑或双值数字的稀疏矩阵。
在阅读时,我理解Matlab不支持其他类型的稀疏矩阵,即uint8
或其他整数。在我的应用程序中,我知道max(values)==16
,内存是一个至关重要的事情,因此我希望有uint8
稀疏矩阵。
有没有办法创建unit8
稀疏矩阵?
如果不是(最有可能),有没有明显的理由说明为什么Matlab没有实现uint8
稀疏矩阵?
答案 0 :(得分:1)
我可以看到如何使用uint8
代替double
而不是改善。
密集矩阵是连续数组,因此不需要额外的索引或结构,每个元素的位置由其在内存中的物理位置给出。
但是稀疏矩阵还应该要求存储每个元素索引,在2D矩阵的情况下,将是32或64位大小的两个整数来记住每个元素的行和列号。最重要的是,可能存在一些与实现相关的开销,例如树结构或其他用于使稀疏矩阵运算有效的开销。
所以它不是8 uint8
vs 64 double
,是内存使用量的8倍,而是(8 + 32 + 32 + log(n)+ ..)vs(64 + 32) + 32 + log(n)+ ..),我猜最终可能会节省10-20%的费用?
此外,如果我没记错的话,每个存储器地址现在存储64位,即一个double
或8 uint8
打包在一起。这意味着每个条目需要使用一些额外的位来记住在我们需要的内存地址处打包的uint8
,并添加一些额外的位屏蔽操作来执行。
所以Mathworks的人可能做了类似的估计,并决定只做double
稀疏矩阵。