文档

访问稀疏矩阵

非零元

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

  • NNZ返回一个稀疏矩阵的非零元素的数目。

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

  • nzmax返回分配用于稀疏矩阵的非零项的存储空间量。

要尝试一下这些加载提供稀疏矩阵west0479,哈威尔波音集合中的一个。

加载west0479谁是
名称大小字节类属性west0479 479x479 34032双疏

这个矩阵模型八级化学蒸馏塔。

试试这些命令。

NNZ(west0479)
ANS = 1887
格式Ëwest0479
west0479 =(25,1)1.0000e + 00(31,1)-3.7648e-02(87,1)-3.4424e-01(26,2)1.0000e + 00(31,2)-2.4523e-02(88.2)-3.7371e-01(27.3)1.0000e + 00(31,3)-3.6613e-02(89,3)-8.3694e-01(28,4)1.3000e + 02。。。
非零(west0479)
ANS = 1.0000e + 00 -3.7648e-02 -3.4424e-01 1.0000e + 00 -2.4523e-02 -3.7371e-01 1.0000e + 00 -3.6613e-02 -8.3694e-01 1.3000e + 02。。。

注意

按Ctrl + C停止非零在任何时候上市。

请注意,最初NNZ具有相同的值作为nzmax默认。即,非零元素的数目等于分配用于非零元素存储位置的数目。然而,MATLAB®如果零出额外的数组元素不会动态释放内存。改变一些矩阵元素为零的值改变的值NNZ,但不是的nzmax

但是,您可以根据需要添加尽可能多的非零元素的矩阵。你是不是原来的值的约束nzmax

指数和值

对于任何矩阵,充分或稀疏,在函数返回的索引和非零元素的值。其语法是

[I,J,S] =发现(S)

返回向量的非零值的行索引一世中,列索引向量中Ĵ,并在矢量中的非零值本身小号。下面使用的例子以定位在稀疏矩阵中的非零元素的索引和值。该功能用途输出,与基体的尺寸一起,来重建矩阵。

[I,J,S] =发现(S);[M,N] =尺寸(S);S =稀疏(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 = 1 1 1 3 1 42 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);S(端)= 1
超过由程序允许的最大变量的大小。

要访问一个元件,其线性索引大于intmax中,使用数组索引:

S(2 ^ 30,2 ^ 30)= 1
S =(1073741824,1073741824)1

而索引的成本为稀疏矩阵来改变单个元件是可以忽略的,它在一个循环的上下文中进行配料,并可以成为大矩阵相当缓慢。出于这个原因,在许多稀疏矩阵元素需要改变的情况下,最好是矢量化操作,而不是使用循环。例如,考虑稀疏矩阵:

N = 10000;A = 4 * speye(N);
更改的元素一个内的循环需要的是比类似矢量操作慢:
抽动;A(1:N-1,N)=  -  1;A(N,1:N-1)= -1;TOC
经过时间是0.003344秒。
抽动;对于K = 1:N-1,C(K,N)=  -  1;C(N,K)= -1;结束,TOC
经过时间是0.448069秒。
由于MATLAB存储在稀疏压缩稀疏列格式的矩阵,它需要在移位的多个条目一个每一次通过循环期间。

预分配为稀疏矩阵的存储器中,然后填充在其逐元素方式同样导致索引到所述稀疏数组的开销显著量:

S1 = spalloc(1000,1000,100000);抽动;对于n = 1时:100000 I =小区(1000 *兰特(1,1));J =小区(1000 *兰特(1,1));S1(I,J)=兰特(1,1);结束TOC
经过时间是2.577527秒。

构建索引和值向量无需索引稀疏数组,因而显著更快:

I =小区(1000 *兰特(100000,1));J =小区(1000 *兰特(100000,1));V =零(大小(I));对于n = 1时:100000 V(N)=兰特(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

直接与构造的五列的矩阵使用该行下标,下标列,和值三元组对功能:

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,S)
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商店稀疏矩阵怎样的更多信息,请参见约翰·吉尔伯特,克里夫·莫勒尔,和罗伯特·施赖伯的稀疏矩阵在Matlab中的设计与实现SIAM杂志矩阵分析与应用,13:1,333-356(1992))。

可视化稀疏矩阵

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

例如:

加载供给稀疏矩阵west0479,哈威尔波音集合中的一个。

加载west0479

查看稀疏结构。

间谍(west0479)

也可以看看

相关话题