主要内容

访问稀疏矩阵

非零元素

有几个命令,提供高级信息稀疏矩阵的非零元素:

  • nnz返回非零元素的数量在一个稀疏矩阵。

  • 非零返回一个列向量,其中包含所有的稀疏矩阵的非零元素。

  • nzmax返回的存储空间分配给一个稀疏矩阵的非零元素。

尝试一些,负载提供的稀疏矩阵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秒。
由于MATLAB稀疏矩阵存储在压缩稀疏列格式,它需要将多个条目一个在每个通过循环。

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:

C = ( 4 0 0 0 1 0 4 0 0 1 0 0 4 0 1 0 1 0 1 0 1 4 1 1 4 )

直接与构造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存储稀疏矩阵的更多信息,见约翰·r·吉尔伯特克里夫硅藻土,和罗伯特·施赖伯在MATLAB稀疏矩阵:设计和实现,(暹罗《矩阵分析和应用程序十三1,333 - 356 (1992))。

可视化稀疏矩阵

通常很有用使用图形格式查看稀疏矩阵中的非零元素的分布。MATLAB间谍函数产生一个稀疏的模板视图结构,图上的每个点代表一个非零的数组元素的位置。

例如:

负载提供的稀疏矩阵west0479,Harwell-Boeing集合之一。

负载west0479

查看稀疏结构。

间谍(west0479)

图包含一个坐标轴对象。坐标轴对象包含一个类型的对象。

另请参阅

相关的话题