语法:
reshape(p)
reshape(p,行 列 页 ……)
说明:第一个变量是待重组的数组p,后面的变量是重新生成数组的行数、列数、页数”。
【例2.18】用函数来生成多维数组。
a=[1 2;3 4]; b=[1 1;2 2];
c= cat(2,a,b) %沿着第二维连接生成数组c
c =
1 2 1 1 3 4 2 2 cat(3,a,b) %沿着第三维连接
ans(:,:,1) = 1 2 3 4 ans(:,:,2) = 1 1 2 2
repmat(a,[2 2 2]) %放置模块数组a
ans(:,:,1) =
1 2 1 2 3 4 3 4 1 2 1 2 3 4 3 4 ans(:,:,2) =
1 2 1 2 3 4 3 4 1 2 1 2 3 4 3 4
reshape(c,[2 2 2]) %重组二维数组为2行2列2页的三维数组
ans(:,:,1) = 1 2 3 4 ans(:,:,2) = 1 1 2 2
2. 多维数组的标识
? 直接给出数组的维数 语法: ndims (p)
? 给出数组各维的大小
语法:
[m,n,…]=size(p) m=size(p,x)
%得出各维的大小 %得出某一维的大小
说明:p为需要得出大小的多维数组;m为行数,n为列数…;当只有一个输出变量时, x=1返回第一维(行数),x=2返回第二维(列数),以此类推。
? 返回行数或列数的最大值
语法: length(p)
说明:length(p)等价于max(size(p))。 【例2.19】得出矩阵的大小。
a=[1 2;3 4;5 6]
a =
1 2 3 4 5 6
ndims(a) %得出维数
ans = 2
size(a) %得出各维的大小
ans =
3 2
size(a,2) %得出列的大小
ans = 2
length(a) %得出最大维的大小
ans = 3
2.3稀疏矩阵
一个矩阵中如果包含很多元素值为0,则此矩阵可以只存储少量的非0元素,这个矩阵称为稀疏矩阵(Sparse Matrix)。
2.3.1稀疏矩阵的建立
稀疏矩阵大部分的元素都是0,因此只需储存非零元素的下标和元素值,这种特殊的存储方式可以节省大量的存储空间和不必要的运算。
1. 使用sparse函数产生稀疏矩阵
sparse函数用于创建稀疏矩阵,或将一个全元素矩阵直接转换成稀疏矩阵。 语法:
sparse(i,j,s,m,n) %直接创建稀疏矩阵
sparse(p) %由全元素矩阵p转换为稀疏矩阵
说明:i、j是非0元素的行、列下标;s是非0元素所形成的向量;m、n是s的行、列维数,可省略;i、j、s都是长度相同的向量,生成矩阵的元素s(k)下标分别是i(k)和j(k);p为全元素矩阵。
【例2.20】产生稀疏矩阵。
a=eye(3);
a(4,:)=[-5 -2 -3]
a =
1 0 0 0 1 0 0 0 1 -5 -2 -3
b=sparse(a) %创建稀疏矩阵
b =
(1,1) 1 (4,1) -5 (2,2) 1 (4,2) -2 (3,3) 1 (4,3) -3
c=sparse([1 4 2 4 3 4],[1 1 2 2 3 3],[1 -5 1 -2 1 -3]) %创建与b相同的稀疏矩阵
c =
(1,1) 1 (4,1) -5 (2,2) 1 (4,2) -2 (3,3) 1 (4,3) -3
与sparse函数相反,full函数可将稀疏矩阵转变为全元素矩阵。 语法:
full(p) %将稀疏矩阵p转变为全元素矩阵 【例2.20续】将稀疏矩阵转变为全元素矩阵。
full(b)
ans =
1 0 0 0 1 0 0 0 1 -5 -2 -3
2. 用spdiags函数创建稀疏矩阵
spdiags函数是用对角线元素来构建一个稀疏矩阵。 语法:
spdiags(D,k,m,n)
说明:矩阵D的每一列代表矩阵的对角线向量;k代表对角线的位置(0代表主对角线,-1代表向下位移一单位的次对角线,1代表向上位移一单位的次对角线,依此类推);m、n分别代表矩阵的行、列维数。
【例2.20续】用spdiags函数创建稀疏矩阵。
D=[3 2 9;2 4 9;1 1 4]
D =
3 2 9 2 4 9 1 1 4 d=[0 1 2];
s=spdiags(D,d,4,3) %构成4行3列的稀疏矩阵
s =
(1,1) 3 (1,2) 4 (2,2) 2 (1,3) 4 (2,3) 1 (3,3) 1 full(s)
ans =
3 4 4 0 2 1 0 0 1 0 0 0
程序分析:可以看出矩阵s的三个非零对角线向量分别是D的三个列向量。主对角线为“3 2 1”;向上位移一单位的次对角线为“2 4 1”,但其中“2” 被移掉了;向上位移两单位的次对角线为“9 9 4”,但其中“9 9” 都被移掉了。
3. 用spconvert函数从外部文件输入稀疏矩阵
可以将load命令和spconvert函数结合,将文本文件(如*.dat)调用到内存,然后将文本文件内容转换成稀疏矩阵。也可以直接用save或load命令将稀疏矩阵保存到MAT文件中或从MAT文件调用到内存中。
语法:
spconvert (Filename)
【例2.20续】用load命令和spconvert函数结合转换稀疏矩阵。 用文本编辑器生成ASCⅡ文本文件,spr.dat的内容可显示如下: 1 1 1 4 1 -5 2 2 1 4 2 -2 3 3 1 4 3 -3
其中:第1列、第2列分别代表稀疏矩阵的行、列下标,第3列则是元素值。
load spr.dat %装载文本文件
b= spconvert(spr) b =
(1,1) 1 (4,1) -5
%转换成稀疏矩阵
(2,2) 1 (4,2) -2 (3,3) 1 (4,3) -3 save spr b clear
load spr b b b =
(1,1) 1 (4,1) -5 (2,2) 1 (4,2) -2 (3,3) 1 (4,3) -3
%保存spr.mat文件 %装载spr.mat文件
2.3.2稀疏矩阵的存储空间
MATLAB提供了得出稀疏矩阵元素个数的函数: ? nnz:可返回稀疏矩阵的非零元素个数。
? nonzeros:返回一个包含所有非零元素的列向量。
? nzmax:返回最大的非零元素个数,当nnz>nzmax时,MATLAB会动态调整增加内存给nzmax,以储存新增的非零元素。
? spy:用图形观看稀疏矩阵的非零元素分布情况。
【例2.20续】查看稀疏矩阵的非零元素,图2.4所示为用spy函数得出的稀疏矩阵分布图。
图2.4 稀疏矩阵分布图 nnz(b) %得出非零元素个数 ans = 6