备战数学建模1-MATLAB矩阵相关

目录

一、数值数据

二、常用函数

三、变量及其操作

四、矩阵的基础应用

五、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)

 

 

三、变量及其操作

变量名区分字母大小写,不能用字母或者下划线开头。看下面的例题。

备战数学建模1-MATLAB矩阵相关_第1张图片

 代码如下:

 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)

五、MATLAB基本运算

一、算术基本运算

加(+),减(-),乘(*),除(/),右除(\),乘方(^).

加减运算,要求两个矩阵同型,不同型不能运算。一个标量也可以进行加减运算,就是将标量与矩阵的每个元素进行加减运算。

乘法运算,要求矩阵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 

备战数学建模1-MATLAB矩阵相关_第2张图片

 上面的例子,就需要使用点乘运算符。

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)

若字符串中有单引号字符,则需要使用两个单引号来表示。

备战数学建模1-MATLAB矩阵相关_第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-MATLAB矩阵相关_第4张图片

我们看一下上面的例子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的逆矩阵。

备战数学建模1-MATLAB矩阵相关_第5张图片 

 我们可以看一下上面的例子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])

 备战数学建模1-MATLAB矩阵相关_第6张图片

 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阶方阵,如果存在常数\lambda和n为非0向量x,使得等式

Ax=\lambdax,则称\lambda 是A的特征值,x是对应特征值\lambda 的特征向量。

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) 

 特征值的几何意义: 

备战数学建模1-MATLAB矩阵相关_第7张图片

我们看下上面的例子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') ;

绘制的图形如下所示:

备战数学建模1-MATLAB矩阵相关_第8张图片

 

十一、稀疏矩阵

 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)

备战数学建模1-MATLAB矩阵相关_第9张图片

我们看一下上图求解三对角线性方程组的例子,代码如下:

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

你可能感兴趣的:(matlab,数学建模,矩阵,数学,线性代数)