>> m_full=magic(1100);%创建一个1100*1100的矩阵
>> m_full(m_full>50)=0;%将大于50的元素替换为零
>> m_sparse=sparse(m_full);%将这个一般矩阵,转换成稀疏矩阵形式储存
>> whos
Name Size Bytes Class Attributes
m_full 1100x1100 9680000 double
m_sparse 1100x1100 9608 double sparse
m_full和m_sparse其实是一个矩阵,但是两种储存方式决定了其所占用字节的大小
- 创建稀疏矩阵
sparse(A)函数会实现稀疏矩阵的创建
>> A(1,4)=1;A(2,2)=1;A(3,1)=1;A(3,2)=2;A(4,3)=3
A =
0 0 0 1
0 1 0 0
1 2 0 0
1 0 3 0
>> s=sparse(A)%将矩阵A转化成稀疏矩阵存储方式
s =
(3,1) 1
(4,1) 1
(2,2) 1
(3,2) 2
(4,3) 3
(1,4) 1
>> B=full(s)%将稀疏矩阵重新转化为一般矩阵
B =
0 0 0 1
0 1 0 0
1 2 0 0
1 0 3 0
1.直接创建矩阵
sparse(i,j,s,m,n)
i,j是行号和列号,s是一个全是非零元素的矢量,m是行数,n是列数
>> S=sparse([1,3,2,1,4],[3,1,4,1,4],[1,2,3,4,5],4,4)
S =
(1,1) 4
(3,1) 2
(1,3) 1
(2,4) 3
(4,4) 5
>> full(S)
ans =
4 0 1 0
0 0 0 3
2 0 0 0
0 0 0 5
2.从对角线元素中创建稀疏矩阵
使用spdiags(B,d,m,n)
此函数用于创建一个大小为m行n列的稀疏矩阵,其非零元素来自于矩阵B中的元素且按照对角线排列,参数d指定矩阵B中生成稀疏矩阵B的对角线的位置,可以认为矩阵的主对角线 为第0条对角线,每向右上移动一位就加一,向左下移动就减1。
>> B=reshape(1:12,4,3);
>> d=[-3,0,2];
>> A=spdiags(B,d,7,4)
A =
(1,1) 5
(4,1) 1
(2,2) 6
(5,2) 2
(1,3) 11
(3,3) 7
(6,3) 3
(2,4) 12
(4,4) 8
(7,4) 4
>> full(A)
ans =
5 0 11 0
0 6 0 12
0 0 7 0
1 0 0 8
0 2 0 0
0 0 3 0
0 0 0 4
3.稀疏矩阵的运算
稀疏矩阵的组合
A =
1 0 0
0 0 1
1 2 0
>> B=sparse(A)
B =
(1,1) 1
(3,1) 1
(3,2) 2
(2,3) 1
>> C=[A(:,1),B(:,1)]
C =
(1,1) 1
(3,1) 1
(1,2) 1
(3,2) 1
可见C是一个稀疏矩阵
扫描二维码关注公众号,回复:
5641249 查看本文章
稀疏矩阵子矩阵的赋值
>> A=[1 0 0;0 0 1;1 2 0];
>> B=sparse(A);
>> C=sparse(cat(1,full(B),A))
C =
(1,1) 1
(3,1) 1
(4,1) 1
(6,1) 1
(3,2) 2
(6,2) 2
(2,3) 1
(5,3) 1
>> i=[1 2 3]
i =
1 2 3
>> j=[1 2 3]
j =
1 2 3
>> T=C(i,j)
T =
(1,1) 1
(3,1) 1
(3,2) 2
(2,3) 1
>> C(j,i)=T
C =
(1,1) 1
(3,1) 1
(4,1) 1
(6,1) 1
(3,2) 2
(6,2) 2
(2,3) 1
(5,3) 1
将稀疏矩阵赋值给一般矩阵,仍然返回稀疏矩阵
4.稀疏矩阵的交换和重新排序
对于交换矩阵p,对稀疏矩阵S进行行交换可表示为p*S,进行列交换时为S*p
对于一个矢量p,p为一般矢量,对稀疏矩阵进行行交换就是S(p,:),列交换就是S(:,p),也可以对某一列进行行交换如S(p,n)
>> A
A =
1 0 0
0 0 1
1 2 0
>> p=[1 3 2];
>> A(p,:)
ans =
1 0 0
1 2 0
0 0 1
其实就相当于索引
>> s_1=speye(3)
s_1 =
(1,1) 1
(2,2) 1
(3,3) 1
>> p_1=s_1(p,:)%对矩阵进行行行交换
p_1 =
(1,1) 1
(3,2) 1
(2,3) 1
返回的仍为稀疏矩阵
>> A=[0 1 2 3;3 2 1 0;0 0 2 0;1 0 0 1]
A =
0 1 2 3
3 2 1 0
0 0 2 0
1 0 0 1
>> P=colperm(A)
P =
1 2 4 3
>> B=A(:,P)
B =
0 1 3 2
3 2 0 1
0 0 0 2
1 0 1 0
利用colperm()函数返回A中列向量中肺两个数 的排序,利用交换,得到排序后的矩阵。