这是我第一次张贴任何东西,所以请你好! 我正在研究一个关于随机游走算法的代码,我迷失了使用稀疏来制作点和边集的稀疏拉普拉斯矩阵。我打算制作我自己的稀疏函数代码,但是我在理解它的工作方式和输出方面遇到了问题,所以任何帮助都是完美的。
谢谢大家!
答案 0 :(得分:2)
稀疏矩阵是一种特殊类型的"矩阵"在matlab中,它在概念上等同于普通矩阵,但在引擎盖下工作方式不同。
它们被称为"稀疏",因为它们通常用于人们期望矩阵的大多数元素包含零,并且只有少数非零元素的情况。
使用这种特殊对象的优点是创建这样一个对象所需的内存主要取决于所包含的非零元素的数量,而不是"实际"的大小。基质
相比之下,正常(完整)矩阵需要相对于其大小分配的内存。因此,例如,一个1000x1000的数字矩阵(所谓的'双倍')将需要大约8Mb字节来存储(100万个元素,每个8字节' double'),即使所有元素为零。观察:
>> a = zeros(1000,1000);
>> b = sparse(1000,1000);
>> whos
Name Size Bytes Class Attributes
a 1000x1000 8000000 double
b 1000x1000 8024 double sparse
现在,在下标(1,1)处为每个人分配一个值,看看会发生什么:
>> a(1,1) = 1 % without a semicolon, this will flood your screen with zeros
>> b(1,1) = 1
b =
(1,1) 1
正如您所看到的,稀疏矩阵仅跟踪非零值,并且“0”表示“零”。 现在让我们添加一些元素:
>> a(1:100,1:100) = 1;
>> b(1:100,1:100) = 1;
>> whos
Name Size Bytes Class Attributes
a 1000x1000 8000000 double
b 1000x1000 168008 double sparse
正如您所看到的,a
的已分配内存未发生变化,因为整个阵列的大小未发生变化。而对于b
,因为它现在包含更多的非零值,它会在内存中占用更多空间。
通常,大多数稀疏矩阵应该使用与普通矩阵相同的操作;这样做的原因是大多数'正常'函数被明确定义为也接受稀疏矩阵,但在引擎盖下对它们进行不同的处理(即它们试图得到相同的结果,但在内部使用不同的方法来做到这一点,更适合于稀疏矩阵)。 e.g:
>> c = sum(a(:))
c =
10000
>> d = sum(b(:))
d =
(1,1) 1000000
你可以转换'一个完整的矩阵直接用稀疏的sparse
命令,一个稀疏的矩阵回到'#34; full"使用full
命令的矩阵:
>> sparse(c)
ans =
(1,1) 10000
>> full(d)
ans =
1000000