matlab学习——稀疏矩阵

>> 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中列向量中肺两个数 的排序,利用交换,得到排序后的矩阵。

猜你喜欢

转载自blog.csdn.net/qq_43264642/article/details/88767225