访问稀疏矩阵
非零元素
有几个命令,提供高级信息稀疏矩阵的非零元素:
尝试一些,负载提供的稀疏矩阵west0479
,Harwell-Boeing集合之一。
负载west0479谁
类属性名称大小字节west0479 479 x479 34032双稀疏
这个矩阵模型化学蒸馏塔盛行一时。
试试这些命令。
nnz (west0479)
ans = 1887
格式短ewest0479
1 west0479 =(25日)1.0000 e + 00(31日1)-3.7648 e-02 (87 1) -3.4424 e-01(26岁,2)1.0000 e + 00(31岁,2)-2.4523 e-02 (88 2) -3.7371 e-01(27岁,3)1.0000 e + 00(31岁,3)-3.6613 e-02 (89 3) -8.3694 e-01(28日,4)1.3000 e + 02。
非零(west0479)
ans = 1.0000 e + 00 -3.7648 e-02 -3.4424 e-01 1.0000 e + 00 -2.4523 e-02 -3.7371 e-01 1.0000 e + 00 -3.6613 e-02 -8.3694 e-01 1.3000 e + 02。
请注意
使用Ctrl + C停止非零
清单在任何时间。
注意,最初nnz
有相同的价值nzmax
默认情况下。也就是说,非零元素的数量相当于存储位置的数量分配给非零。然而,MATLAB®没有动态释放的内存,如果你取消额外的数组元素。改变一些矩阵元素的值为零的价值变化nnz
,但不是的nzmax
。
然而,你可以添加尽可能多的非零元素矩阵。你不是原始值的约束nzmax
。
指数和价值观
对于任何一个矩阵,完整的或稀疏,找到
函数返回非零元素的指标和价值观。它的语法是
(i, j s) =找到(s);
找到
返回非零值的行索引向量我
,列索引向量j
,非零值向量年代
。下面的例子使用找到
定位指数和一个稀疏矩阵的非零值。的稀疏的
函数使用找到
输出,加上矩阵的大小,重新创建矩阵。
S1 = west0479;[i, j s] =找到(S1);[m, n] =大小(S1);S2 =稀疏(i, j s, m, n);
索引在稀疏矩阵操作
因为稀疏矩阵存储在压缩稀疏列格式,有不同的成本与索引和索引稀疏矩阵比成一个完整的矩阵。这样的成本是微不足道的,当你需要改变只有几个元素在一个稀疏矩阵,所以在这种情况下是很正常的使用常规数组索引,重新分配值:
B = speye (4);(i, j s) =找到(B);(i, j s)
ans = 1 1 1 2 2 1 3 3 1 4 4 1
B (3,1) = 42;(i, j s) =找到(B);(i, j s)
ans 42 = 1 1 1 3 1 2 2 1 3 3 1 4 4 1
42
在(3,1)
,MATLAB将额外的行插入零值向量和下标向量,然后所有矩阵值变化(3,1)
。
使用线性索引访问或分配一个元素在一个大型稀疏矩阵线性指数将会失败如果超过2 ^ 48-1
,这是当前上限允许在一个矩阵的元素数量。
S = spalloc(2 ^ 30 2 ^ 30日,2);(结束)= 1
最大变量大小超过所允许的程序。
访问一个元素的线性指数大于intmax
使用数组索引:
30年代(2 ^ 2 ^ 30)= 1
S = 1 (1073741824, 1073741824)
而索引的成本改变一个元素到一个稀疏矩阵是可以忽略不计,这是加剧的背景下一个循环,可以成为大型矩阵非常缓慢。出于这个原因,在这种情况下,需要改变许多稀疏矩阵元素,最好是使用一个循环的操作而不是进行向量化。例如,考虑一个稀疏矩阵:
n = 10000;= 4 * speye (n);
一个
在一个循环慢于类似的矢量化操作:抽搐(1:n - 1, n) = 1;一个(n, 1: n - 1) = 1;toc
运行时间是0.003344秒。
抽搐为k = 1: n - 1 C (k, n) = 1;C (n, k) = 1;结束toc
运行时间是0.448069秒。
一个
在每个通过循环。
Preallocating稀疏矩阵,然后填充它的内存以聪明元素的方式同样会导致大量的开销在索引为稀疏阵列:
S1 = spalloc (1000、1000、100000);抽搐;为n = i = 1∶装天花板(1000 *兰德(1,1));j =装天花板(1000 *兰德(1,1));S1 (i, j) =兰德(1,1);结束toc
运行时间是2.577527秒。
构建指数和值的向量就不需要索引稀疏阵列,从而更快:
i =装天花板(1000 *兰德(100000 1));j =装天花板(1000 *兰特(100000 1));v = 0(大小(i));为n = v (n) = 1∶兰德(1,1);结束抽搐;S2 =稀疏(i, j, v, 1000, 1000);toc
运行时间是0.017676秒。
出于这个原因,最好是构造稀疏矩阵一次使用一个构造函数,就像稀疏的
或spdiags
功能。
例如,假设您希望坐标矩阵的稀疏形式C
:
直接与构造five-column矩阵稀疏的
函数使用下标的三联体双行,列下标,和值:
i = [1 5 2 5 3 5 4 5 1 2 3 4 5) ';j = [1 1 2 2 3 3 4 4 5 5 5 5 5] ';s = [4 1 4 1 4 1 4 1 1 1 1 1 4) ';C =稀疏(i, j)
C = (1,1) 4 (5、1) 1 (2, 2) 4 (5, 2) 1 (3、3) 4 (5,3) 1 (4, 4) 4 (5, 4) 1 (1、5) 1 (2、5) 1 (3、5) 1 (4、5) 1 (5,5) 4
可视化稀疏矩阵
通常很有用使用图形格式查看稀疏矩阵中的非零元素的分布。MATLAB间谍
函数产生一个稀疏的模板视图结构,图上的每个点代表一个非零的数组元素的位置。
例如:
负载提供的稀疏矩阵west0479
,Harwell-Boeing集合之一。
负载west0479
查看稀疏结构。
间谍(west0479)