2 MATLAB数据及其运算
2.1 MATLAB数据的特点
矩阵是matlab最基本、最重要的数据对象,大部分运算或命令都是在矩阵运算的意义下执行的,而且这种运算定义在复数域上。单个数据(标量)可以看成是仅含一个元素的矩阵。
在一般情况下,矩阵的每个元素必须有相同的数据类型:
双精度型:占64位(8个字节),用double函数实现转换;
单精度型:占32位(4个字节),用single函数实现转换;
带符号整数和无符号整数:转换函数有int8、int16、int32、uint8、uint16、uint32;
字符数据:char函数转换;
结构体(Structure)和单元(Cell);
稀疏矩阵(Sparse):多维矩阵以及工程中应用十分广泛;
逻辑型数据:1(非0)真,0假。
2.2 变量及其操作
2.2.1变量与赋值
1.变量命名
以字母开头,后接字母、数字或下划线的字符序列,最多63个字符。变量名区分大小写。
2.赋值语句
(1)变量=表达式
(2)表达式(赋值给matlab预定义的ans)
一般的,运算结果在命令窗口中显示出来。如果在语句的最后加上分号,执行赋值但是不在命令窗口显示出来。
注释:用“%”符号开头
3.预定义变量
预定义变量 | 含义 |
---|---|
ans | 计算结果的默认赋值变量 |
eps | 机器零阈值 |
pi | 圆周率的近似值 |
i,j | 虚数单位 |
inf,Inf | 无穷大,如1/0的结果 |
NaN,nan | 非数,如0/0,inf/inf的结果 |
nargin | 函数输入参数的个数 |
nargout | 函数输出参数的个数 |
realmax | 最大正实数 |
realmin | 最小正实数 |
lasterr | 存放最新的错误消息 |
lastwarn | 存放最新的警告信息 |
MATLAB预定义变量有特定的含义,使用时应该尽量避免对这些变量的重新赋值,避免使用关键字。
2.2.2 变量的管理
1内存变量的显示与删除
who和whos用于显示工作空间中驻留的变量名清单。但whos在给出变量名的同时还给出他们的维数、所占字节数以及变量的类型。
clear命令用于删除MATLAB工作空间中的变量,注意,预定义变量不可以删除。
clc命令清空命令行。
通常,对于较大的矩阵输入,可采用变量编辑器。具体操作方法:
- 在命令窗口中向一个新变量赋空矩阵
- 在工作空间窗口中打开该变量
- 在变量编辑窗口中出现空白表格,即可输入
2 内存变量文件
mat文件可以把当前matlab工作空间中的一些有用的变量长久地保留下来。
mat文件的生成和装入:save和load命令来完成
常用格式为
save 文件名 【变量名表】 【-append】【-ascii】
load 文件名 【变量名表】 【-ascii】
其中文件名可以带路径,但不需要带拓展名.mat,变量名表中的变量个数不限,变量名之间以空格隔开。
2.2.3 数据的输出格式
MATLAB采用十进制表示一个常数,具体可采用日常计数法和科学计数法两种表示方法。
用e或E表示10为底的指数,如1234e-3-5i
可以用format命令设置或改变数据的输出格式。
format 格式符
格式符 | 含义 |
short | 输出小数点后4位,最多不超过7位有效数字。对于大于1000的实数,用5位有效数字的科学技术形式输出 |
long | 15有效数字形式输出 |
short e | 5位有效数字的科学技术形式输出 |
long e | 15位有效数字的科学技术形式输出 |
short g | 从short和short e中自动选择最佳输出方式 |
long g | 从long和long e中自动选择最佳输出方式 |
rat | 近似有理数表示 |
hex | 十六进制 |
+ | 正数、负数、零分别用+、-、空格表示 |
bank | 银行格式,元角分表示 |
compact | 输出变量之间没有空行 |
loose | 输出变量之间有空行 |
默认输出是short格式
2.3 MATLAB矩阵的表示
2.3.1 矩阵的建立
1.直接输入法
A=[1 2 3 ;4 5 6;7 8 9]
A=[1 2 3
4 5 6
7 8 9]
复数矩阵可以采用另一种输入方式
R=[1,2,3;4,5,6];
I=[6,7,8;9,10,11];
ri=R+i*I
2.利用M文件建立矩阵
- 启动MATLAB文本编辑器,输入代建矩阵
- 把输入的内容存盘
- 在MATLAB命令窗口中输入M文件的文件名,即运行该M文件,就会自动建立一个M文件中命名的矩阵
3.建立大矩阵
大矩阵可以由方括号中的小矩阵建立起来。例如
A=[1 2 3;4 5 6;7 8 9];
C=[A,eye(3);ones(3),A]
eye(n)返回n*n单位矩阵,ones(n)返回n*n全1矩阵
2.3.2 冒号表达式
可以产生行向量
冒号表达式的一般格式:
e1:e2:e3
e1为初始值,e2为步长,e3为终止值
如果e2不写,默认步长为1
在MATLAB中,还可以使用linspace函数产生行向量。
x=linspace(a,b,n)
a和b是第一个和最后一个元素,n是元素总数。当n省略时,自动产生100个元素
2.3.3 矩阵的拆分
1.矩阵元素
MATLAB允许用户对一个矩阵的单个元素进行赋值和操作。例如将矩阵A的第三行第二列的元素赋值为200,可通过下面的语句来完成:
A(3,2) = 200
如果给出的行列下标大于原来矩阵的,MATLAB将自动拓展原来的矩阵,将未赋值的矩阵元素置为0。
在MATLAB中,也可以采用矩阵元素的序号来引用矩阵元素。矩阵序号就是相应元素在内存中的排列顺序。矩阵元素按列编号,先第一列,再第二列,依次类推。例如
A=[1,2,3;4,5,6];
A(3) 的结果是2
显然,序号(Index)与下标(Subscript)是一一对应的,以m*n矩阵A为例,矩阵元素A(i,j)的序号为(j-1)*m+i。其相互转换关系也可利用sub2ind和ind2sub函数求得。例如:
sub2ind(size(A),1,2)
结果为3
[i,j] = ind2sub(size(A),3)
其中,size(A)函数返回包含两个元素的向量,分别是矩阵A的行数和列数。相关的函数有:
- length(A)给出行数和列数的较大者,即length(A)=max(size(A))
- ndims(A)给出A的维数
- reshape(A,m,n)函数在矩阵总元素保持不变的前提下,将矩阵A重新排成m*n的二维矩阵
注意:在matlab中,矩阵元素按列存储,reshape函数只改变原矩阵的行数和列数,即改变其逻辑结构,并不改变原矩阵元素个数及它的存储结构。
有:
A(1,3):1行3列
A(3):第三个
A([1 3],[1 3]):第一行和第三行与第一列和第三列相交的4个元素
2.矩阵拆分
(1)利用冒号表达式获得子矩阵
- A(:,j)取A矩阵的第jj列全部元素;A(i,:)取第i行全部元素
- A(i:i+m,:)表示取矩阵A的第i~i+m行的全部元素,A(i:i+m,k:k+m)
- A(:)将矩阵A的每一列元素堆叠起来,成为一个列向量,而这也是MATLAB变量的内部储存方式。
A=[23,54,65;34,6,55];
B=A(:)
C=reshape(A,6,1)
%二者等价
此外,还可以利用一般向量和end运算符等来表示矩阵下标,从而获得子矩阵。end表示某一维的末尾元素下标。例如:
A(end,:) %取A最后一行元素
A([1,4],3:end) %取A第1,4两行中第3列到最后一列的全部元素
(2)利用空矩阵删除矩阵的元素
X=[] %给变量X赋为空矩阵
A(:,[2,4]) = [] %删除第二列和第四列全部元素
2.4 MATLAB数据的运算
2.4.1 算术运算
1.基本算术运算
+,-,*,/(右除),\(左除),^
(1)矩阵加减运算
远算规则:若A、B矩阵的维数相同,则对应元素相加减。
(2)矩阵乘法
要求矩阵A的列数与矩阵B的行数相同,则可乘。
假定矩阵A、B,A为m*n矩阵,B为n*p矩阵,C=A*B为m*p矩阵,其各个元素为:
(3)矩阵除法
如果A矩阵是非奇异(行列式不为0的矩阵称为非奇异矩阵)方阵,则A\B和B/A运算可以实现。A\B等效于A的逆左乘B,inv(A)*B,B/A等效于A的逆右乘B,B*inv(A)。
(4)矩阵的乘方
用A^x表示,要求A为方阵,x为标量。
2.点运算
在有关运算符前面加点,所以叫做点运算。有
.* , ./ , .\ , .^
两矩阵进行点运算是指它们的对应元素进行相关运算,要求两矩阵的维数相同。
A.*B表示A和B单个元素之间对应相乘。显然与A*B不同。
如果A、B两矩阵具有相同的维数,则A./B表示A矩阵除以B矩阵的对应元素。B.\A等价于A./B。
3.MATLAB常用的数学函数
函数名 | 含义 |
---|---|
sin | |
cos | |
tan | |
asin | arcsin |
atan | |
acos | |
sinh | 双曲正弦函数 |
cosh | 双曲余弦函数 |
tanh | 双曲正切函数 |
asinh | 反双曲正弦函数 |
acosh | |
atanh | |
sqrt | 平方根函数 |
log | 自然对数函数 |
log10 | 常用对数函数 |
log2 | 以2为底的对数函数 |
exp | 自然指数函数 |
pow2 | 2的幂 |
abs | 绝对值函数 |
angle | 复数的幅角 |
real | 复数的实部 |
imag | 复数的虚部 |
conj | 负数的共轭运算 |
rem | 求余数或模运算 |
mod | 模运算 |
fix | 向零方向取整 |
floor | 不大于自变量的最大整数 |
ceil | 不小于自变量的最小整数 |
round | 四舍五入到最邻近的整数 |
sign | 符号函数 |
gcd | 最大公因子 |
lcm | 最小公倍数 |
函数使用说明:
- abs函数可以求实数的绝对值、复数的模、字符串的ASCII值
- 用于取整的函数有fix,floor,ceil,round
- rem与mod函数的区别。rem(x,y)与mod(x,y)要求x、y必须为相同大小的实矩阵或为标量,rem(x,y)=x-y.*fix(x./y),mod(x,y)=x-y.*floor(x./y)
2.4.2关系运算
<,<=,>,>=,==,~=(不等于)
关系运算符的运算法则:
- 当两个比较量是标量的时候,直接比较两个数的大小。若关系成立返回1,否则返回0.
- 比较两个维数相同的矩阵,比较对应位置元素逐个比较,给出元素比较的结果,结果也是一个矩阵。
- 一个标量与矩阵比较,把标量与矩阵的每一个元素逐个比较,并给出比较结果。最终运算结果是一个维数与矩阵相同的矩阵。
2.4.3逻辑运算
&(与),|(或),~(非)
运算法则为:
- 确认非零元素为真,1表示;否则为0
- 设参与逻辑运算的是两个标量a和b,那么
- a&b:a,b全为非零时,结果为1,否则为0
- a|b:a,b有一个为非零,结果为1,否则为0
- ~a:a是0结果为1,a是非零结果为0
- 两个同维矩阵逻辑运算,将相同位置上元素按标量规则逐个进行。结果是个矩阵
- 一个标量和一个矩阵逻辑运算,把把标量与矩阵的每一个元素逐个运算。结果是个矩阵
- 逻辑非是单目运算符,也服从矩阵运算规则
- 在算数、关系、逻辑运算中,算数运算优先级最高,逻辑运算优先级最低
例题:在[0,3π]区间,求y=sinx的值。要求:
- 消去负半波
- 在
和
区间内取值均为
.
方法一:
x=0:pi/100:3*pi;
y=sin(x);
y1=(x<pi|x>2*pi).*y; %消去负半波
q=(x>pi/3&x<2*pi/3)|(x>7*pi/3&x<8*pi/3);
qn=~q;
y2=q*sin(pi/3)+qn.*y1; %处理第二步
方法二:
x=0:pi/100:3*pi;
y=sin(x);
y1=(y>=0).*y;
p=sin(pi/3);
y2=(y>=p)*p+(y<p).*y1;
函数名 | 含义 |
all | 若向量的所有元素非零,则结果为1 |
any | 向量中的任何一个元素为0都返回结果1 |
exist | 检查变量在工作空间是否存在,若存在结果1,否则0 |
find | 找出向量或矩阵中非零元素的位置 |
isempty | 若被查变量矩阵是空阵,结果为1 |
isglobal | 若被查变量矩阵是全局变量,结果1 |
isinf | 若元素是±inf,则结果矩阵相应位置元素取1,否则0 |
isnan | 若元素是nan,则结果矩阵相应位置元素取1,否则0 |
isfinite | 若元素值大小有限,则结果矩阵相应位置元素取1,否则0 |
issparse | 若变量是稀疏矩阵,则结果矩阵相应位置元素取1,否则0 |
isstr | 若变量是字符串,则结果矩阵相应位置元素取1,否则0 |
xor | 若两矩阵对应元素同为0或非0,则结果矩阵相应位置元素取1,否则0 |
例题:建立矩阵A,找出[10,20]区间的元素的位置。
A=[4,15,-45,10,6;56,0,17,-45,0]
find(A>=10&A<=20)
结果:
A =
4 15 -45 10 6
56 0 17 -45 0
ans =
3
6
7
注意:矩阵元素的位置是由相应元素的序号来表示的。矩阵元素的序号和下标可以相互转换。
A=[4,15,-45,10,6;56,0,17,-45,0]
B=find(A>=10&A<=20)
[i,j]=ind2sub(size(A),B)
结果:
A =
4 15 -45 10 6
56 0 17 -45 0
B =
3
6
7
i =
1
2
1
j =
2
3
4
2.5字符串
在MATLAB中,字符串函数是用单括号括起来的字符序列。例如:
xm='Central South University'
MATLAB将字符串当做一个行向量,每个字符对应一个元素,标识方法和数值向量相同。也可以建立多行字符串矩阵。但是要求各行字符数目相同,可以用空格调整字数。
字符串是以ASCII码形式储存的。abs和double函数都可以用来获取字符串矩阵所对应的ASCII码数值矩阵。相反,char函数可以将ASCII码矩阵转化为字符串矩阵。
例题:建立一个字符串向量,做以下处理:
- 取第1~5个字符组成子字符串
- 将字符串倒过来重新排
- 将字符串的小写字母变成相应的大写字母,其余字符不变
- 统计字符串中小写字母的个数
ch='ABc123d4e56Fg9';
subch=ch(1:5) %取字符串
revch=ch(end:-1:1) %将字符串倒排
k=find(ch>='a'&ch<='z'); %找到小写字母的位置
ch(k)=ch(k)-('a'-'A'); %将小写字母变成相应的大写字母
char(ch)
length(k) %统计小写字母的个数
与字符串相关的另一个重要函数eval,其调用格式:
eval(t);t是字符串
它的作用是把字符串的内容作为对应的MATLAB命令执行。
函数名 | 意义 |
setstr | 将ASCII码转换为字符 |
mat2str | 将矩阵转换成字符串 |
num2str | 将数值转换成字符串 |
int2str | 将整数转换成字符串 |
str2num | |
strcat | 用于字符串连接 |
strcmp | 用于字符串比较 |
注意:
- 字符串中的字符含有单撇号,则该单撇号字符需要用两个单撇号来表示
- 对于较长的字符串可以用字符串向量表示,即用[]括起来,例如:
f=70;
c=(f-32)/1.8;
disp(['Room temperature is',num2str(c),'degrees C.'])
2.6结构数据和单元数据
2.6.1 结构数据
MATLAB通过使用结构(Strcture)数据类型把一组不同类型但同时又是在逻辑上相关的数据组成一个有机的整体。
具体格式:
结构矩阵名.成员名=表达式
结构矩阵元素的成员也可以是结构数据。例如
a(2).x1.x11=90
删除结构的成员:rmfield函数
a=rmfield(a,'x4')
函数名 | 含义 |
struct | 建立或转化为结构矩阵 |
getfield | 获取结构成员的内容 |
rmfield | 删除结构的成员 |
isstruct | 是结构时,值为真 |
fieldnames | 获取结构成员名 |
setfield | 设定结构成员的内容 |
isfield | 成员在结构中,值为真 |
2.6.2 单元数据
空
、
3 MATLAB矩阵分析与处理
3.1 特殊矩阵
3.1.1 通用的特殊矩阵
- zeros:全0矩阵
- ones:全1矩阵
- eye:单位矩阵
- rand:0~1均匀分布的随机矩阵
- randn:均值为0,方差为1的标准正态分布随机矩阵
用法:
- zeros(m) %m阶方阵
- zeros(m,n)
- zeros(size(A))
例题:建立随机矩阵
- 在区间[20,50]内取均匀分布的5阶随机矩阵。
- 均值为0.6、方差为0.1的5阶正态分布随机矩阵。
>> x=20+(50-20)*rand(5)
x =
44.4417 22.9262 24.7284 24.2566 39.6722
47.1738 28.3549 49.1178 32.6528 21.0714
23.8096 36.4064 48.7150 47.4721 45.4739
47.4013 48.7252 34.5613 43.7662 48.0198
38.9708 48.9467 44.0084 48.7848 40.3621
>> y=0.6+sqrt(0.1)*randn(5)
y =
0.9272 0.8809 1.0549 0.5677 0.5905
0.8299 0.2373 0.7028 0.5236 0.5479
0.5040 0.2620 0.3613 0.7009 0.7985
0.6929 0.3440 1.0333 0.6989 0.9457
0.3510 -0.3311 0.0588 0.3265 0.9508
3.1.2 用于专门学科的特殊矩阵
这里只记录了3个常用的特殊矩阵。
范特蒙德矩阵
>> A=vander([1;2;3;5])
A =
1 1 1 1
8 4 2 1
27 9 3 1
125 25 5 1
伴随矩阵
设多项式p(x)为:
称矩阵:
为多项式p(x)的伴随矩阵,p(x)称为A的特征多项式,方程p(x)=0的根称为A的特征值。
例如:求的伴随矩阵。
>> p=[1,0,-7,6];
>> compan(p)
ans =
0 7 -6
1 0 0
0 1 0
帕斯卡矩阵
二次项展开后的系数随n的增大组成一个三角形表,称为杨辉三角形。由杨辉三角形组成的矩阵称为帕斯卡(Pascal)矩阵。
例题:求的展开式。
>> pascal(6)
ans =
1 1 1 1 1 1
1 2 3 4 5 6
1 3 6 10 15 21
1 4 10 20 35 56
1 5 15 35 70 126
1 6 21 56 126 252
矩阵次对角线上的元素1、5、10、10、5、1即为展开式的系数。
4 MATLAB程序设计
4.1 M文件
4.1.1 M文件的分类
根据调用方式不同分为两类:命令文件(Script File)和函数文件(Function File),主要区别:
- 命令文件没有输入参数,也不返回参数,而函数文件可以带输入参数,也可以返回参数
- 命令文件对工作空间中的变量进行操作,函数文件对局部变量操作
- 命令文件可以直接运行,函数文件需要以函数调用的方式运行
可以用whos命令查看工作空间中的变量。
4.2 程序的控制结构
程序的控制结构有3种:顺序结构、选择结构和循环结构。
4.2.1 顺序结构
1.数据的输入
从键盘输入数据,可以使用input函数进行,其调用格式为:
A=input(提示信息,选项);
例如:xm=input('What's your name?','s');表示的是:提示信息为:What's your name?选项s表示要接收键盘的数据是字符串类型,并把这个字符串赋值给xm变量。
2.数据的输出
调用格式为: disp(输出项);
注意,用disp函数显示矩阵时将不显示矩阵的名字
3.程序的暂停
pause函数,使用格式 pause(延迟秒数)
强制终止程序的运行:Ctrl+C
4.2.2 选择结构
1.if语句
if 条件
语句组
end
if 条件
语句组1
else
语句组2
end
if 条件1
语句组1
elseif 条件2
语句组2
else
语句组3
end
2.switch语句
switch 表达式
case 表达式1
语句组1
case 表达式2
语句组2
otherwise
语句组3
end
例如:商场打折,价格在[0,200)没有折扣,[200,200)3%折扣,[500,1000)5%折扣,[5000,5000+)14%折扣。
price = input('请输入商品价格');
switch fix(price/100)
case {0,1}
rate =0;
case{2,3,4}
rate =3/100;
case{5:9}
rate = 5/100;
otherwise
rate = 14/100;
end
price=price*(1-rate);
运行结果:
请输入商品价格788
price =
677.6800
4.2.3 循环结构
1.for语句
for 循环变量=表达式1:表达式2:表达式3
循环体语句
end
MATLAB画热图
MATLAB画图技巧与实例(十一):热图heatmap函数 - 知乎 (zhihu.com)
MATLAB画折线图
Matlab绘制折线图详细方法_matlab画论文中的折线图-优快云博客
MATLAB数学建模
线性规划
基于问题求解线性规划
prob=optimproblem('ObjectiveSense','max');
%ObjectiveSense是目标类型为求最大值的意思
%prob=optimproblem就是默认求最小值
b=[10;8;7];
A=[2,1
1,1
0,1];
x=optimvar('x',1,2,'TYPE','integer','LowerBound',0,'UpperBound',inf);
%optimvar函数是一种类似于赋值的函数
%第一个‘x’里面是变量名,后面说的是该变量所包含的行数和列数
%‘TYPE’,后面定义的是该函数所属类型,比如说integer整数型,double双精度型号等
%‘LowerBound'与'UpperBound'表示下界与上界所跟的0,inf分别是范围
prob.Objective=f*x;
%目标函数需要得到一个标量数值,不是矩阵向量!,所以注意自己不能用.*
%这里是设置目标函数
prob.Constraints.con=A*x<=b;
%注意这里不是.*!那个得到的是一个矩阵,这个是线性代数里的矩阵相乘,得到数值,注意维度
[sol fval flag]=solve(prob);
fval
sol.x
层次分析法(AHP)
用人话讲明白AHP层次分析法(非常详细原理+简单工具实现)_ahp分析-优快云博客
笔记还在整理中……