目录
一、数值数据
二、常用函数
三、变量及其操作
四、矩阵的基础应用
五、MATLAB基本运算
六、字符串处理
七、特殊矩阵
八、矩阵变换
九、矩阵求值
十、矩阵的特征值与特征向量
十一、稀疏矩阵
(1)整型
整型分为有符号整型号和无符号整型。
有符号的8位整型范围:-128~127
如下使用int8转换成有符号的8为整数,越界了,答案是127。
int8(129)
无符号的8位整型的范围:0~255
如下使用uint(8)转换为无符号的8位整数,没有越界,答案是129。
(2)浮点型
浮点型分为单精度浮点型(4个字节)和双精度浮点型(8个字节),双精度精度更高。可以使用single函数和double函数将数值类型分别转换成单精度型和双精度型。
在MATLAB中数值数据默认是双精度型。
(3)复数型
包含实部和虚部两个部分,实部和虚部默认为双精度型,虚数单位用i或者j来表示。
real函数求复数的实部,imag函数求虚数的虚部。
format命令可以控制数据的输出格式,不影响数据的计算和存储。
如下代码将结果转换成long型输出。
format long
50 / 3
exp函数求自然指数,两行两列的矩阵对应行列求自然指数。
A = [4,2 ; 3,6] ;
B = exp(A)
三角函数,有以弧度为单位的函数和以角度为单位的函数,如果是以角度为单位的函数,需要在函数后面加上d。
ans = sin(pi / 2)
ans = sind(90)
abs函数可以求实数的绝对值,复数的模以及字符的ASCII码。
如下三个的结果分别为8,5,97。
abs(-8)
abs(3+4i)
abs('a')
取整的函数,round函数用于四舍五入的取整,ceil是向上取整,floor是向下取整,fix舍去小数取整。
如下四个的答案分别为4,3,4,3。
ans = round(3.5)
ans = floor(3.6)
ans = ceil(3.2)
ans = fix(3.8)
rem函数和mod函数,用于取余。
如下是98对10取余,结果是8,两个函数一样的效果。
ans = mod(98, 10)
ans = rem(98, 10)
isprime函数判断是否是素数。 是输出1,反之输出0.
下面分别输出1和0.
isprime(2)
isprime(4)
变量名区分字母大小写,不能用字母或者下划线开头。看下面的例题。
代码如下:
x = sqrt(7) - 2i ;
y = exp(pi / 2) ;
z = (5 + cosd(47)) / (1 + abs(x - y))
预定义变量一般如下:
ans表示默认赋值变量,i和j代表虚数单位,pi代表圆周率,NAN代表非数。
1-矩阵的建立
(1)直接输入,同行的矩阵用逗号分割,不同行的矩阵用分号分割。
如下建立三行三列的矩阵。
A = [1,2,3; 4,5,6; 7,8,9]
(2)利用已经建立好的矩阵去拼接更大的矩阵。
如下三行三列的矩阵拼接成六行六列的矩阵。
A = [1,2,3; 4,5,6; 7,8,9] ;
B = [-1,-2,-3; -4,-5,-6; -7,-8,-9] ;
C = [A,B; B,A]
(3)用实部矩阵和复部矩阵构建复数矩阵。
A = [1,2,3; 4,5,6] ;
B = [6,7,8; 9,10,11] ;
C = A + B*i
(4)冒号表达式
e1:e2:e3 表示初始值为e1,步长为e2,终止值为e3的行向量。其中步长e2可以省略,默认步长为1.
如下所示,输出为0 1 2 3 4 5
0 : 1 : 5
也可以使用linspace函数生成行向量,linspace(a,b,n),其中a代表第一个元素,b代表最后一个元素,n为元素总数。
x = linspace(0,pi,6)
(5)结构矩阵和单单元矩阵
结构矩阵的格式为 结构矩阵元素.成员名=表达式, 单元矩阵用大括号括起来,和普通矩阵类似,单源矩阵中的数据类型不同。
(6)矩阵元素的引用
通过下标引用矩阵的元素,如下创建2行2列的元素,并将第1行1列的元素修改为10.
A = [1,2,3; 4,5,6] ;
A(1,1) = 10
如下通过序号引用,该值是5.
A = [1,2,3; 4,5,6] ;
A(4)
利用冒号表达式来获得子矩阵。
A(i,:)表示第i行的全部元素;A(:,j)表示第j列的全部元素
A(i:i+m,j:j+m)表示i到i+m行,j到j+m列的全部元素,A(i:i+m,:)表示i到i+m行的全部元素
如下所示:创建一个3行5列的矩阵A,然后获取第一行和第二行的所有列元素,然后获取第二行和第三行的第1列到第5列步长为2的元素。
A = [1,2,3,4,5,6; 7,8,9,10,11,12; 13,14,15,16,17,18] ;
A(1:2,:)
A(2:3,1:2:5)
end运算符,表示某一维的某尾元素下标。
如下创建3行3列的矩阵,
获取矩阵的最后一行的所有列元素。
获取1到3行的第2列到最后列的元素。
A = [1,2,3,4,5; 6,7,8,9,10; 11,12,13,14,15] ;
A(end,:)
A(1:3,2:end)
(7)删除矩阵中的元素
利用空矩阵删除矩阵元素,即将矩阵直接赋值为空。
如下创建3行3列的矩阵,删除第2列和第3列。
A = [1,2,3; 4,5,6; 7,8,9] ;
A(:,2:3)= []
(8)改变矩阵的形状
函数reshape(A,m,n)表示在矩阵总元素不变的情况下,将矩阵排成一个m行n列的2维矩阵。
如下:将1为矩阵改造成3行2列的矩阵。
A = [1,2,3,4,5,6] ;
y = reshape(A,3,2)
一、算术基本运算
加(+),减(-),乘(*),除(/),右除(\),乘方(^).
加减运算,要求两个矩阵同型,不同型不能运算。一个标量也可以进行加减运算,就是将标量与矩阵的每个元素进行加减运算。
乘法运算,要求矩阵A的列数与矩阵B的行数相等。
在MATLAB中有两种矩阵除法运算,即右除\和左除/。
如果A是非奇异方阵,那么B/A等于B*inv(A) 而A\B等于inv(A)*B
对于矩阵来说,左除和右除表示的结果不相等。
如下所示,是不相等的。
A = [1,2,3; 4,2,6; 7,4,9] ;
B = [4,3,2; 7,5,1; 12,7,92] ;
ans = A/B
ans = B\A
矩阵和标量进行运算,则左除和右除是相等的。如下是相等的。
A = [1,2,3; 4,5,6] ;
A / 2
2 \ A
矩阵的平方就是两个矩阵相乘,如下所示。
A = [1,2,3; 4,2,1; 1,2,3] ;
A^2
点运算符号
包括 .* ./ .\ .^
两个矩阵进行点运算,是指对应元素进行相关运算。矩阵要求同型。
如下所示,矩阵C和矩阵D是不同的,点乘得到的是对应元素相乘 ,乘法得到是矩阵乘法。
A = [1,2,3; 1,2,3; 2,3,4] ;
B = [0,1,2; 3,2,1; 0,1,1] ;
C = A .* B
D = A * B
上面的例子,就需要使用点乘运算符。
x = 0.1 : 0.3 : 1 ;
y = sin(x) .* cos(x)
关系运算符
包括:<,>,<=,>=,~=
若是标量比较,为真返回1,否则返回0
例子:建立3阶方阵,判断矩阵元素是否为偶数。
A = [1,2,3; 4,5,6; 7,8,2] ;
mod(A,2)==0
逻辑运算
与&, 或|,非~
这个和常规的一样,不多说。为正返回1,否则返回0
我们看一下上面这个例子。
m = 100:1:999 ;
m1 = mod(m, 10) ;
m2 = mod(fix(m/10), 10) ;
m3 = fix(m / 100) ;
index = find(m==m1.*m1.*m1+m2.*m2.*m2+m3.*m3.*m3) ; %找到对应元素的下标
ans = m(index)
在MATLAB中字符串用单引号括起来的。
如下一个字符行向量,取字符的1到3个元素。
x = 'jxust' ;
ans = x(1:3)
若字符串中有单引号字符,则需要使用两个单引号来表示。
看上面的一个例子,我们创建字符串,并进行四步操作。
ch = 'ABc123d4e56Fg9' ;
subch = ch(1:5)
rev = ch(end:-1:1)
k = find(ch>='a' & ch<='z') ;
ch(k) = ch(k) - ('a' - 'A')
ans = length(k)
字符串的执行。
eval函数,将参数字符串当作命令 进行执行。
如下命令输出行向量 3.1416 0.0000 -1.0000
t = pi ;
m = '[t, sin(t),cos(t)]' ;
ans = eval(m)
字符串与数值之间的转换。
abs和double函数都可以获得字符串矩阵对应的ASCII数值矩阵。
char函数可以把ASCII值矩阵转换乘成字符串矩阵。
s1 = 'MATLAB';
a = abs(s1)
b = char(a+32)
字符串的比较,对应元素的ASCII码对应 比较,结果是对应元素为1或者0.
常用的字符串比较函数有4种:
1-strcmp(s1,s2)表示字符s1和s2是否相等,相等返回1,反之返回0.
2-strncmp(s1,s2,n)表示字符s1和字符s2的前n个字符是否相等。
3-strcmpi(s1,s2)表示在忽略字符串大小写的情况下,s1和s2是否相等。
4-strncmpi(s1,s2,n)表示在忽略字符串大小写的情况下,前n个字符是否相等。
如下代码分别返回1和0.
strcmp('www1','www0')
strncmp('www1','www0',3)
字符串的查找与替换
findstr(s1,s2)函数是返回短字符串在长字符串中的开始位置。
strrep(s1,s2,s3)函数将字符串s1中的所有子字符串s2替换成s3.
如下两行代码分别是找到is在前面字符串中的开始位置,返回3和6
然后是将字符串中test替换为class
index = findstr('This is a test','is')
result = strrep('this is a test', 'test', 'class')
通用特殊矩阵
zeros函数:产生全0矩阵,即0矩阵。
ones函数:产生 全1矩阵,即幺矩阵。
eye函数:产生对角线为1的矩阵,当矩阵为方阵时,为单位矩阵。
rand函数:产生(0,1)区间内均匀分布的随机矩阵。
randn函数:产生均值为0,方差为1的标准正态分布随机矩阵。
下面代码产生2行3列的0矩阵,然后转换成3行2列的0矩阵。
A = zeros(2,3)
B = zeros(size(reshape(A,3,2)))
我们看一下上面的例子1:
代码如下:
A = fix(10 + 90*rand(5)) ;
B = 0.6 + sqrt(0.1) * randn(5) ;
C = eye(5) ;
(A+B)*C == C*A + B*C
魔方矩阵,magic函数生成,每行和每列元素和相等。主副对角线上各元素和相等。
n阶魔方阵的每行每列元素和为(n+n^3)/2
我们看一下上面的例子2.代码如下:结果为260
M = magic(8) ;
sum(M(:,1))
sum(M(1,:))
范德蒙矩阵,希尔伯特矩阵,伴随矩阵,帕斯卡矩阵。
1-对角矩阵
只有对角线上元素为非0的矩阵为对角矩阵。
对角线上元素都相等的对角矩阵称为数量矩阵。
对角线上元素都为1的矩阵称为单位矩阵。
提取对角线的元素函数如下:
diag(A)函数提取矩阵A主对角线元素,产生一个列向量
diag(A,k)函数提取矩阵A第K条对角线元素,产生一个列向量
构造对焦矩阵函数如下:
diag(V):以向量V为主对角线产生对角矩阵。
diag(V,K):以向量V为对K条对角线产生对角矩阵。
如上例子1,代码如下:
A = [7,0,1,0,5; 3,5,7,4,1; 4,0,3,0,2; 1,1,9,2,3; 1,8,5,2,9] ;
D = diag(1:5) ;
ans = D * A
2-三角矩阵
上三角矩阵:矩阵对角线以下元素全为0.
下三角矩阵:矩阵对角线以上元素去全为0.
triu(A)函数表示提取矩阵A主对角线以上的元素。
triu(A,K)函数表示提取矩阵A第K条对角线以上的元素。
如下代码产生4阶的幺矩阵,并提取第-1条对角线以上的元素,其余元素为0.
ans = triu(ones(4), -1)
tril(A)函数提取矩阵A主对角线以下的元素
tril(A,K)函数提取矩阵A第K条对角线以下的元素。
如下代码产生4阶的幺矩阵,并提取第1条对角线以下的元素,其余元素为0.
ans = tril(ones(4), 1)
矩阵的转置
转置运算是小数点后面接单引号。共轭转置其运算符号是单引号。
如下代码为矩阵A的转置:
A = [1,2,3; 4,5,6; 7,8,9] ;
ans = A.'
矩阵的翻转
fliplr(A)函数对矩阵A实现左右翻转
flipud(A)函数对矩阵A实现上下翻转
我们可以看一下上面的例子2,代码如下:
B1 = diag(D) ;
A = magic(5) ;
B = diag(A) ; %提取主对角线元素
C = sum(B) ; %求和
D = flipud(A) ; %矩阵A上下翻转
C1 = sum(B1) ;
C == C1
矩阵的求逆
若存在方阵A和B,使得A*B=B*A=单位矩阵,则A是B的逆矩阵,且B是A的逆矩阵。
inv(A)函数求矩阵A的逆矩阵。
我们可以看一下上面的例子3,代码如下:
A = [1,2,3; 1,4,9; 1,8,27] ; %系数矩阵
b = [5; -2; 6] ; %结果矩阵
x = inv(A) * b
1-求矩阵的行列式
det(A)函数求A矩阵的行列式。
如下代码求矩阵A和A的逆的行列式。
A = [1,2; 3,4] ;
ans = det(A)
det(inv(A))
2-矩阵的秩
矩阵中线性无关的行数或者列数称为矩阵的秩。
rank(A)函数用于求矩阵A的秩。
我们看一下例子2,求矩阵的秩,并绘制直方图。
for n = 3 : 20
r(n) = rank(magic(n)) ;
end
bar(r)
grid on
axis([2,21,0,20])
3-矩阵的迹
矩阵的迹等于矩阵的对角线元素之和,也就是等于矩阵的特征值之和。
trace(A)函数用于求矩阵A的迹。代码如下所示:
A = [1,2,3; 4,5,6; 7,8,9] ;
b = trace(A)
b = sum(diag(A)) %提取A的对角线元素再求和,等价于求矩阵的迹
4-向量和矩阵的范数
矩阵或向量的范数用来度量矩阵或者向量在某种意义下的长度。
向量1范数:向量的绝对值之和。
向量2范数:向量元素平方和的平方根。
向量无穷大范数:所有向量元素绝对值中的最大值。
求向量的范数的函数如下:
norm(v,2)函数表示求向量V的2范数
norm(v,1)函数表示求向量V的1范数
norm(v,inf)函数表示求向量V的无穷大范数
矩阵范数类似
矩阵特征值的数学定义:设A是n阶方阵,如果存在常数和n为非0向量x,使得等式
Ax=x,则称 是A的特征值,x是对应特征值 的特征向量。
eig()函数求解矩阵特征值,函数调用方式入下:
E = eig(A) 表示求矩阵A的全部特征值,构成向量E。
[X,D] = eig(A)表示求矩阵A的全部特征值,构成对角矩阵D,并产生矩阵X,X的各列是相应的特征向量。
如下代码为求矩阵A的全部特征值,并构建对角矩阵D,X为相应的特征向量。
A = [1,1,0; 1,0,5; 1,10,2] ;
[X,D] = eig(A)
特征值的几何意义:
我们看下上面的例子2,代码如下:
x = [0,0.5,0.5,3,5.5,5.5,6,6,3,0; 0,0,6,0,6,0,0,8,1,8] ;
A = [1,0.5; 0,1] ;
y = A * x ;
subplot(2,2,1) ;
fill(x(1,:),x(2,:),'r') ;
subplot(2,2,2) ;
fill(y(1,:),y(2,:),'r') ;
绘制的图形如下所示:
MATLAB中矩阵的存储方式:
1-完全存储:所有元素全部存储,按照列的方式进行存储
2-稀疏存储:仅存储非零元素的值及位置,也是按列存储
完全存储函数与稀疏存储函数的转换问题
A=sparse(S)函数表示讲完全存储S矩阵转换为稀疏存储矩阵A。
S=full(A)函数表示讲矩阵A转换为完全存储矩阵S。
如下代码创建5阶单位矩阵并转换为稀疏矩阵A,再将稀疏矩阵A转换为完全矩阵B。
A = sparse(eye(5))
B = full(A)
直接建立稀疏存储矩阵:
spare函数的其它调用形式:
sparse(m,n)函数表示生成一个m*n的所有元素都是0的稀疏矩阵
sparse(u,v,S)函数u,v,S是三个等长的向量,S是要建立的稀疏存储矩阵的非零元素,u(i)和v(i)分别代表S(i)的行下标和列下标。
直接建立稀疏矩阵A,并转换为完全矩阵B,代码如下:
A = sparse([1,2,2],[2,1,4],[4,5,-7]) ;
B = full(A)
我们看一下上图求解三对角线性方程组的例子,代码如下:
kf1 = [1;1;2;1;0] ;
K0 = [2;4;6;6;1] ;
k1 = [0;3;1;4;2] ;
B = [kf1, K0, k1] ;
d = [-1; 0; 1] ;
A = spdiags(B,d,5,5) ;
f = [0; 3; 2; 1; 5] ;
ans = inv(A)* f