第四部分 数组和矩阵
1.一维数组的创建
(1)逐个元素输入法:
Variantname=[element1 element2 element3 ...element n]
Variantname=[element1,element2,element3,...element n]
Variantname=[element1 ;element2;element3;...element n]
Variantname=[element1
element2
...
element n]
Variantname表示所要创建的数组名,element表示数组元素
例:
>> x1=[6 2 3]
x1 =
6 2 3
>> x2=[7,5,8]
x2 =
7 5 8
>> y1=[7;5;8]
y1 =
7
5
8
>> y2=[6
2
7]
y2 =
6
2
7
(1)冒号生成法
Variantname=a:inc:b
Variantname=[a:inc:b]
Variantname=[a,a+inc*1,a+inc*2,...a+inc*n]
inc是元素之间的间隔(也称为步长),可正可负可省略,省略默认为1
若(b-a)是inc的倍数,则数组最后一个元素等于b
若(b-a)不是inc的整数倍,当a+inc*(n+1)超过b时,数组最后一个元素为a+inc*n
a,b必须为实数,b大于a时,inc应为正数,否则负数不可取0
例:
>> x1=3:5
x1 =
3 4 5
>> x2=[1:0.5:3.2]
x2 =
1.0000 1.5000 2.0000 2.5000 3.0000
>> x3=3.2:-0.5:1
x3 =
3.2000 2.7000 2.2000 1.7000 1.2000
(2)定数线性采样法
linspace()函数格式:
Variantname=linspace(a,b,n)
n为总元素个数,大于1的整数,n可省略省略时默认值为100,若a,b都为实数,则该指令等效于Variantname=a:(b-a)/(n-1):b
例:
>> x1=linspace(2,4,6)
x1 =
2.0000 2.4000 2.8000 3.2000 3.6000 4.0000
>> x2=linspace(8,pi,3)
x2 =
8.0000 5.5708 3.1416
>> y1=linspace(8,3,-0.5)
y1 =
Empty matrix: 1-by-0
logspace()函数格式:
variantname=logspace(a,b,n)
例:
>> x1=logspace(1,2,5)
x1 =
10.0000 17.7828 31.6228 56.2341 100.0000
>> x2=logspace(3,1,6)
x2 =
1.0e+03 *
1.0000 0.3981 0.1585 0.0631 0.0251 0.0100
>> y1=linspace(4,6,1)
y1 =
6
注:logspace()函数的用法和linspace()函数用法相似,区别:
linspace()函数创建的数组范围a~b,等效于Variantname=a:(b-a)/(n-1):b
logspace()函数创建数组的范围是~,等效于Variantname=::
2.一维数组子数组的寻访和赋值
(1)一维数组子数组的寻访
arrayname(index)
例:
>> x=6:10 %创建一维行数组x,数组元素为6,7,8,9,10
x =
6 7 8 9 10
>> y=[6;7;8] %创建一维列数组y,数组元素为6,7,8
y =
6
7
8
%index为单个整数时
>> x(2) %寻访x数组的第二个元素,结果为7
ans =
7
>> y(3) %寻访y数组的第三个元素,结果为8
ans =
8
%index为正整数数组时
>> x([1,3,5]) %寻访x数组的第1,3,5个元素
ans =
6 8 10
>> a=y([2,3]) %寻访y数组的第2,3个元素,并将其赋值给a
a =
7
8
>> b=x(2:5) %寻访x数组的第2~5个元素,并将其赋值给b
b =
7 8 9 10
>> x(2:end) %寻访x数组的第2~5个元素
ans =
7 8 9 10
>> y(1:end) %寻访y数组的第1~3个元素
ans =
6
7
8
>> x(linspace(2,4,3)) %寻访x数组的第2,3,4个元素
ans =
7 8 9
>> y(linspace(1,3,3)) %寻访y数组的第1,2,3个元素
ans =
6
7
8
(2)一维数组子数组的赋值:
arrayname(index)=new arrayvalue
arrayname为被赋值的数组名,arrayname(index)为被赋值数组的子数组,arrayname(index)代表对arrayname的寻访。new arrayvalue为将要赋给等式左端的数组或数值
例:
>> x=6:10; %创建一个一维行数组x,数组元素为6,7,8,9,10
>> y=[6;7;8]; %创建一个一维列数组y,数组元素为6,7,8
%index为单个正整数时
>> x(2)=10; %将x数组的第二个元素赋值为10
>> y(3)=5; %将y数组的第三个元素赋值为5
%index为正整数数组时
>> x([1,3,5])=[8,2,7]; %将x数组的第1,3,5个元素赋值为8,2,7
>> y([2,3])=[1,2]; %将y数组的第2,3个元素赋值为1,2
>> y(1:end)=linspace(2,4,3) %将y数组的第1~3个元素赋值为2,3,4
y =
2
3
4
>> x(linspace(2,4,3))=8 %将x数组的第2~4个元素赋值为8
x =
8 8 8 8 7
3.二维数组的创建和寻访
(1)直接输入法:
Variantname=[exp11 exp12 exp13...;exp21 exp22 exp23...;expn1 expn2 expn3...]
Variantname=[exp11,exp12,exp13...;exp21,exp22,exp23...;expn1,expn2,expn3...]
Variantname=[exp11 exp12 exp13
exp21 exp22 exp23
...
expn1 expn2 expn3]
Variantname=[exp11,exp12,exp13...
exp21,exp22,exp23...
...
expn1,expn2,expn3...]
例:
>> x1=[9 2 3;7,11,9;4:-2:0]
x1 =
9 2 3
7 11 9
4 2 0
>> x2=[2,3,6
linspace(0,pi,3)
7,2,3]
x2 =
2.0000 3.0000 6.0000
0 1.5708 3.1416
7.0000 2.0000 3.0000
(2)利用M文件创建和保存数组
在MATLAB工具栏中单机【新建】按钮,将自动启动M文件编辑窗口,输入二维数组x:
编辑完成后点保存,并将文件命名为“Scriptx.m”,然后退出M文件编辑窗口
在MATLAB命令窗口执行“Scriptx”命令后,MATLAB将创建“Scriptx.m”中定义数组,如:
>> Scriptx
x =
0.2000 0.5800 0.7200
0.8000 0.4000 2.5000
(3)二维数组子数组的寻访和赋值
二维数组子数组访问的基本格式:
arrayname(row index,column index)
其中,row index,column index分别代表行索引与列索引,可为正整数或正整数数组。
A(:,j)表示寻访A的第j列元素。
A(i,:)表示寻访A的第i行元素。
A(2:4,3:5)表示寻访A的第2~4行,第3~5列的元素
A(:;:)表示寻访A的所有元素
二维数组子数组赋值的基本格式:
arrayname(row index,column index)=new arrayname
例:
>> x=[2.1,3.5,7.8,4.3,1.9;linspace(pi,10,5);linspace(2,8,5)] %创建3X5的数组x
x =
2.1000 3.5000 7.8000 4.3000 1.9000
3.1416 4.8562 6.5708 8.2854 10.0000
2.0000 3.5000 5.0000 6.5000 8.0000
>> x(3,4) %寻访第三行,第四行的元素
ans =
6.5000
>> a=x(1:3,[1,3]) %将第1~3行,第1,3列元素赋值给a
a =
2.1000 7.8000
3.1416 6.5708
2.0000 5.0000
>> b=x(:,5) %将第5列所有元素赋值给b
b =
1.9000
10.0000
8.0000
>> x(:)=2:16 %对x数组重新赋值
x =
2 5 8 11 14
3 6 9 12 15
4 7 10 13 16
4.执行数组运算的常用函数
(1)随机构建数组函数rand():
rand(n) %生成nXn的随机数组
rand(n1,n2,n3,...nn) %生成n1Xn2Xn3X....Xnn的随机数组
(2)获取数组长度函数size():
size() %获取数组x的各维长度,返回包含数组x各维长度的一维行数组
size(x,dim) %获取数组x的dim维长度
(3)获取数组元素总数函数numel():
numel(x) %获取数组x的元素总数
numel(x,index1,index2...) %获取x(index1,index2...)的元素总数
(4)获取数组指定维度的长度的函数length():
length(x) %获取数组x的最长维度的长度
(5)获取数组平均值函数mean():
mean(x,dim) %以dim维的形式返回数组x的平均值
(6)reshape()函数:
reshape(x,m,n,p...) %利用数组x的值构造mXnXpX...的数组
注:reshape()函数要求至少提供3个元素,即x,m,n
5.向量和子矩阵的生成
%分别使用逐个元素输入法、冒号生产法、定点采样生成法创建向量
>> x=[2;3;4] %向量x,即一维数组x
x =
2
3
4
>> y=[4:-0.5:2] %使用冒号生成法创建一维行向量
y =
4.0000 3.5000 3.0000 2.5000 2.0000
>> z=[linspace(2,8,4)] %使用定点采样生成法创建一维行向量
z =
2 4 6 8
6.矩阵创建函数
函数 | 功能 | 函数 | 功能 |
diag() | 生成对角矩阵 | gallery() | 生成Higham矩阵 |
zeros() | 生成零矩阵 | hadamard() | 生成Hadamard矩阵 |
ones() | 生成元素值全为1的矩阵 | hankel() | 生成Hankel矩阵 |
eye() | 生成单位矩阵 | hilb() | 生成Hilbert矩阵 |
magic() | 生成魔方矩阵 | pascal() | 生成帕斯卡矩阵 |
rand() | 生成随机矩阵 | rosser() | 生成经典对称特征值测试矩阵 |
wilkinson() | 生成Wilkinson特征值测试矩阵 | toeplitz() | 生成Toeplitz矩阵 |
compan() | 生成Companion矩阵 | vander() | 生成范德蒙矩阵 |
7.高维数组的操作
(1)提取矩阵右上角三角形区域内的元素并赋予新矩阵的函数triu()
一般格式:
triu(X) %提取A的主对角线右上方的三角形区域内的元素
triu(X,k) %提取矩阵X的第K根对角线右上方的三角形区域内的元素
例:
>> A=[1:4;5:8;9:12]
A =
1 2 3 4
5 6 7 8
9 10 11 12
>> x1=triu(A)
x1 =
1 2 3 4
0 6 7 8
0 0 11 12
>> x2=triu(A,2)
x2 =
0 0 3 4
0 0 0 8
0 0 0 0
(2)获取矩阵左下三角形区域元素的函数tril()
例:
>> A=[1:4;5:8;9:12]
A =
1 2 3 4
5 6 7 8
9 10 11 12
>> x1=triu(A)
x1 =
1 2 3 4
0 6 7 8
0 0 11 12
>> x2=tril(A,-1) %提取A的主对角线下方第一根对角线的左上方区域内的元素
x2 =
0 0 0 0
5 0 0 0
9 10 0 0
>> x3=x1+x2
x3 =
1 2 3 4
5 6 7 8
9 10 11 12
(3)矩阵翻转函数
一般格式:
flipud(X) %将X沿水平轴翻转
flipud(X) %将X沿垂直轴翻转
flipud(X,dim) %将X沿特定轴翻转。dim等于1时,按行翻转;dim等于2时,按列翻转
%dim等于3时,按页翻转,以此类推
例:
>> A=reshape([1:12],3,4),B=reshape([1:12],2,2,3);
A =
1 4 7 10
2 5 8 11
3 6 9 12
>> x1=flipud(A)
x1 =
3 6 9 12
2 5 8 11
1 4 7 10
>> x2=fliplr(A)
x2 =
10 7 4 1
11 8 5 2
12 9 6 3
>> x3=flipdim(B,3)
x3(:,:,1) =
9 11
10 12
x3(:,:,2) =
5 7
6 8
x3(:,:,3) =
1 3
2 4
(4)矩阵旋转函数
一般格式:
rot90(X) %将A按逆时针方向旋转90度
例:
>> A=[1:4;5:8;9:12]
A =
1 2 3 4
5 6 7 8
9 10 11 12
>> B=rot90(A)
B =
4 8 12
3 7 11
2 6 10
1 5 9
8.矩阵运算
(1)加法和减法
>> A=[1:4;5:8];B=[3:6;7:10];C=2;D=1:4;
>> x1=A+B
x1 =
4 6 8 10
12 14 16 18
>> x2=A-C
x2 =
-1 0 1 2
3 4 5 6
>> x3=A+B*i
x3 =
1.0000 + 3.0000i 2.0000 + 4.0000i 3.0000 + 5.0000i 4.0000 + 6.0000i
5.0000 + 7.0000i 6.0000 + 8.0000i 7.0000 + 9.0000i 8.0000 +10.0000i
>> x4=A+D %运算对象不相等出现错误
Error using +
Matrix dimensions must agree.
(2) 乘法
数组乘法:
>> A=reshape([1:8],2,4);
>> B=reshape([8:-1:1],2,4);
>> A.*B
ans =
8 18 20 14
14 20 18 8
矩阵的普通乘法:
>> A=reshape([1:9],3,3);
>> B=reshape([9:-1:1],3,3);
>> c=2;
>> x1=A*B
x1 =
90 54 18
114 69 24
138 84 30
>> x2=A*C
x2 =
2 8 14
4 10 16
6 12 18
矩阵的Kronecker乘法:
>> A=[1 2;3 4];B=[1 2 1;3 6 3];
>> kron(A,B)
ans =
1 2 1 2 4 2
3 6 3 6 12 6
3 6 3 4 8 4
9 18 9 12 24 12
(3)除法
元素除法:
A./B %矩阵A的元素依次被矩阵B的元素除
A.\B %矩阵B的元素依次被矩阵A的元素除
例:
>> a=1:4;b=4:-1:1;c=2;
>> x1=a./b
x1 =
0.2500 0.6667 1.5000 4.0000
>> x2=a.\b
x2 =
4.0000 1.5000 0.6667 0.2500
>> x3=a./2
x3 =
0.5000 1.0000 1.5000 2.0000
一般除法:
>> a=[1 2;3:4];b=[4 3;2 1];c=2;d=5;
>> x1=a\b,x2=a/b
x1 =
-6.0000 -5.0000
5.0000 4.0000
x2 =
1.5000 -2.5000
2.5000 -3.5000
>> y1=inv(a)*b,y2=a*inv(b)
y1 =
-6.0000 -5.0000
5.0000 4.0000
y2 =
1.5000 -2.5000
2.5000 -3.5000
>> x3=c\d,x4=c/d
x3 =
2.5000
x4 =
0.4000
>> x5=a/c,x6=a\c
x5 =
0.5000 1.0000
1.5000 2.0000
Error using \
Matrix dimensions must agree.
%运算对象都为标量时,不能执行左除运算,故x6无法获得运算结果
(4)转置和共轭
非共轭转置 :
A.’ %对矩阵A进行非共轭转置运算
transpose(A) %对矩阵A进行非共轭转置运算
例:
>> A=reshape([1:8],2,4);B=reshape([8:-1:1],2,4);C=A+B*i;
>> x1=A.'
x1 =
1 2
3 4
5 6
7 8
>> x2=transpose(C)
x2 =
1.0000 + 8.0000i 2.0000 + 7.0000i
3.0000 + 6.0000i 4.0000 + 5.0000i
5.0000 + 4.0000i 6.0000 + 3.0000i
7.0000 + 2.0000i 8.0000 + 1.0000i
共轭转置:
>> A=reshape([1:8],2,4);B=reshape([8:-1:1],2,4);C=A+B*i;
>> x2=C'
x2 =
1.0000 - 8.0000i 2.0000 - 7.0000i
3.0000 - 6.0000i 4.0000 - 5.0000i
5.0000 - 4.0000i 6.0000 - 3.0000i
7.0000 - 2.0000i 8.0000 - 1.0000i
9.元素操作函数
(1)指数函数:
exp(A) %以e为底,分别以A的元素为指数,求幂
expm(A) %以e为底,以A为指数,求幂,A必须为行列数相等的矩阵
例:
>> A=[1 2;3 4];
>> x1=exp(A)
x1 =
2.7183 7.3891
20.0855 54.5982
>> x1=expm(A)
x1 =
51.9690 74.7366
112.1048 164.0738
(2)对数函数:
log(A) %对矩阵A的各元素执行对数运算
logm(A) %对矩阵A整体执行对数运算
例:
>> A=[1 2;3 4];B=A+2i;
>> x1=log(A)
x1 =
0 0.6931
1.0986 1.3863
>> x2=logm(B)
x2 =
0.0047 + 2.3109i 1.4426 - 0.5309i
1.6705 - 1.0243i 0.6884 + 0.8307i
(3)开方函数:
sqrt(A) %对矩阵A的各元素执行开方运算
sqrtm(A) %对矩阵A整体执行开方运算
例:
>> A=[1 2;3 4];
>> x1=sqrt(A)
x1 =
1.0000 1.4142
1.7321 2.0000
>> x2=sqrtm(A)
x2 =
0.5537 + 0.4644i 0.8070 - 0.2124i
1.2104 - 0.3186i 1.7641 + 0.1458i