MATLAB入门到精通(三):常用函数及数学应用

2023-10-26

合集如下:
MATLAB入门到精通(一):简介及数据类型
MATLAB入门到精通(二):基本语句及绘图
MATLAB入门到精通(三):常用函数及数学应用


十一、常用函数

11.1 随机数函数

11.1.1 rand()函数

rand()函数用来产生均匀分布的随机数,其基本调用格式如下:

X=rand % 产生一个(0,1)的随机数
X=rand(n) % 产生nxn的矩阵,元素为(0,1)之间的随机数
X=rand(x,y) %产生xxy的矩阵,元素为(0,1)之间的随机数
X=rand(sz) %sz为矩阵,产生size(sz)大小的矩阵
X=rand(...,typename)% typename可以是'single'或'double',产生对应数据类型的随机数

例子如下:

r=rand;
disp(r)
X=rand(2,3,'double');
disp(X)

在这里插入图片描述

11.1.2 randn()函数

randn()函数用于产生正态分布的随机数,其调用格式和rand()函数基本一致,如下:

X=randn % 返回一个标准正态分布的随机向量
X=randn(n) % 产生nxn的矩阵,元素为一个标准正态分布中的值
X=randn(x,y) %产生xxy的矩阵,元素为一个标准正态分布中的值
X=randn(sz) %sz为矩阵,产生size(sz)大小的矩阵
X=randn(...,typename)% typename可以是'single'或'double',产生对应数据类型的随机数

例子如下:

r=randn;
disp(r)
X=randn(2,3);
disp(X)

在这里插入图片描述

11.1.3 randi()函数

randi()函数用于生成伪随机整数,也就是产生整数的函数。调用格式如下:

X=randi(imax) %返回一个(1,imax)之间的随机整数
X=randi(imax,n)  %返回nxn的矩阵,元素为(1,imax)之间的随机整数
X=randi(imax,sz1,sz2) %返回sz1xsz2的矩阵,元素为(1,imax)之间的随机整数
X=randi(imax,sz) %sz为矩阵,返回size(sz)大小元素为(1,imax)之间的随机整数
X=randi([imin,imax],...) %返回imin到imax之间的随机整数

例子如下:

X=randi(5);
disp(X)
X=randi(10,2,2);
disp(X)
X=randi([5,10],[2,2]);
disp(X)

在这里插入图片描述

————————(2023/3/17 18:01 任重道远)———————

11.1.4 randperm()函数

randperm()函数用于生成一组整数的随机排列,调用格式如下:

p=randperm(n) %返回一个1~n的随机排列其不重复的行向量
p=randperm(n,k) %返回一个1~n的随机排列其不重复的行向量

例子如下:

X=randperm(10);
disp(X)
X=randperm(10,5);
disp(X)

在这里插入图片描述


11.2 时间函数

11.2.1 日期和时间

① 获取当前日期时间

要想获取当前的日期和时间,可以使用clock()函数,该函数将当前的日期和时间返回在一个数组中。例子如下:

T=clock;
disp(T)

在这里插入图片描述

也可以使用now()函数返回当天的日期:

T=now;
disp(T)

在这里插入图片描述

另外,data()函数可以以 dd-mmm-yyy的格式返回当天日期的字符串,如下:

T=date;
disp(T)

在这里插入图片描述

② 日期格式的转换

Matlab支持以下三种日期格式:双精度日期数字、各类日期字符串和数值日期向量。使用函数datestr()将日期值转换为表示日期的字符串。调用格式如下:

datestr(date,dateform) %date为要转换的日期值,dateform为日期日期的字符串类型,可以在命令行窗口输入help datestr查看dateform的各种格式

例子如下:

t=now;
T=datestr(now);
disp(T)
T=datestr(t,12); %help datestr 查看12对应的格式
disp(T)
T=datestr(t,25);
disp(T)

在这里插入图片描述

③ 日期函数
日期函数用于从一个日期值或日期字符串中找到具体的日子或星期几。如想知道某天是周几可以使用weekday()函数。例子如下:

[d,w]=weekday('19-Mar-2023');
disp(w)

在这里插入图片描述利用calendar()函数可以生成指定月份的日历。如下:

calendar(date)

在这里插入图片描述

11.2.2 时钟函数

当用户想要计算一组Matlab操作运行时间时,可以使用tic()和toc()函数。tic()函数启动一个秒表,表示计时开始;toc()函数则停止这个秒表,表示计时结束,并计算所经历的时间(单位为秒),例子如下:

tic;
plot(rand(20,6))
toc

在这里插入图片描述


11.3 文件输入输出函数

Matlab提供了一些低级文件I/O函数来读取和写入二进制或ASCII文件,大多与C语言相似。

11.3.1 文件的读写

① 读写二进制文件

使用fread()可以从文件中读取二进制数据,将每一个字节看成一个整数,将结果写入一个矩阵返回,最基本的调用格式如下:

% fid:是用于fopen打开的一个文件的文件标识
% array:是包含有数据的数组
% count:用于读取文件中变量的数目
% size:用于指定读取文件中的变量个数
[array,count]=fread(fid,size,precision)
[array,count]=fread(fid,size,precision,skip)

例子如下:

fid=fopen('test.m','r');%打开文件并获取文件标识
data=fread(fid); %读取到的是二进制数据即ASCII码对应的数字
disp(char(data)');

test.m中的内容:

在这里插入图片描述

输出结果:

在这里插入图片描述
与读取对应的写入操可以通过fwrite()函数实现,fwrite()函数可以将一个矩阵的元素所定的二进制格式写入某个打开的文件,调用格式如下:

% array:写出变量的数组
%count:写入变量的数目
%precission:用于指定输出数据的格式
% skip:用位当单位
count=frite(fid,array,precision,skip)

例子如下:

fid=fopen('test2.m','w');
fwrite(fid,magic(5),'integer*4');
fclose(fid);

② 读写文本文件

Matlab的写入文本文件函数是fpeintf(),其语法格式如下:

%fid是要写入数据那个文件的标识
%format是控制数据显示的字符串
%val1,val2...是Matlab的数据变量
%count是返回成功写入的字节数
count=fprintf(fid,format,val1,val2,...)

例子如下:

a=1:10;
b=[a;a];
fid=fopen('test3.dat','w');
fprintf(fid,'%2d %2d\n',b);
fclose(fid);
type test3.dat

在这里插入图片描述

对应的读取文件的函数为fscanf(),调用格式如下:

[array,count]=fscanf(fid,format,size)

Matlab对文件的操作函数比较多,这里不在一一赘述,列出一张表了解大概,想要进一步学习可以去搜索相关内容。
另外,提一下以二进制读写与格式化读写的比较。一句话概述就是:二进制读写计算机运行更快,但是阅读困难。格式化读写运行较慢,阅读方便。
文件操作汇总表:

类别 函数名 描述
文件打开 fopen 打开文件
文件关闭 fclose 关闭文件
二进制读取 fread 从一个二进制文件中读取全部或部分数据
二进制写入 fwrite 将数据写入一个二进制文件
读取的格式化 fscanf 从文件中读取格式化数据
写入的格式化 fprintf 将格式化数据写入文件
读取的格式化 fgetl 从文件读取行,删除换行符
读取格式化 fgets 从文件读取行,保留换行符
字符串转换写入 sprintf 将格式化数据写入字符串
字符串转换读取 sscanf 在格式控制下读取字符串
文件定位 feof 检测是否到了文件末尾
文件定位 ferror 获取文件I/O状态信息
文件定位 fseek 设置文件定位指针
文件定位 ftell 获取文件定位指针位置
文件定位 frewind 将文件定位指针设置到文件开头
11.3.2 Matlab数据文件

介绍如何将当前Matlab工作区的变量存储到Matlab本机自定义的数据格式以及Matlab数据文件的导入与导出

① .mat文件形式导入导出

二进制MAT文件中包含的都是各变量完整的双精度格式的值及变量的名称,并且保留了变量的名字。
命令行中输入:

save

可以将当前Matlab工作区中的所有变量存储到当前文件夹下的MATLAB.mat文件中。

也可保留特定的变量,格式如下:

save var1 var2 var3...
save('filename','var1','var2','var3'...)

与save命令对应的为load命令,用于加载打开save命令创建的数据文件,在命令行输入:

load

可以把当前文件夹下或者Matlab的搜索路径中找到第一个MATLAB.mat中的所有变量载入到工作区,也可指定变量,格式如下:

load('filename','var1','var2','var3'...)

最后,要想删除已经存在的数据文件,则可以使用delete()函数,例子如下:

delete filename.ext

② 以其他格式导出

Matlab还支持多种工业标准文件格式和一些用户自定的文件格式。
下表列举了一些常用的数据导入和导出函数:

函数名 描述
dlmread 从分割文本文件中读入数据
dlmwrite 将数据写入分隔文本文件
textread 从文件中读入格式化文本
textscan 在利用fopen()函数打开文件后,再读入格式化文本
wklread 从电子表格文件中读入数据
wklwrite 将数据写入电子表格文件
xlsread 从电子表格文件读入
aviread 从AVI文件中读入数据
imread 从图像文件读入数据
imwrite 将数据写入图像文件
auread 从Sum声音文件读入数据
wavread 从Microsoft声音文件读入数据
wavwrite 将数据写入.wav文件

——————(2023/3/19 11:44 有点忙)——————


11.4 特殊操作函数

11.4.1 对位操作函数

除逻辑运算外,Matlab还提供了对一个无符号整数数据的各个位进行逻辑运算的函数。
下面列举一些例子:

format hex %数据格式限定为十六进制
max=intmax('uint16'); % 十六进制的最大数
disp(max)
a=uint16(2^9);
disp(a)
b=uint16(567);
disp(b)

result1=bitand(a,b); %按位相与操作
disp(result1)
result2=bitor(a,b); %按位相或操作
disp(result2)
result3=bitxor(a,b); %按位异或操作
disp(result3)

result4=bitcmp(a); %取反操作
disp(result4)
result5=bitget(b,5); %取前五位
disp(result5)
result6=bitset(b,5); %将前五位设置为1

format short g %还原为默认设置(短浮点型)

在这里插入图片描述

11.4.2 进制相互转换函数

Matlab提供了一些函数用于将十进制数字转换为其他进制的数字,转化的结果一字符串的形式给出
例子如下:

%% 十进制/二进制
a=dec2bin(28); %十进制转化为二进制
disp(a);
b=bin2dec(a); %二进制转化为十进制
disp(b);

%% 十进制/十六进制
a=dec2hex(1024); %十进制转为十六进制
disp(a)
b=hex2dec(a); %十六进制转为十进制
disp(b)

%% 十进制和任意进制转化
a=dec2base(52,5); %十进制转化为五进制
disp(a)
b=base2dec(a,3);
disp(b)

11.4.3 集合函数

① isequal()函数

用于比较两个集合是否相等。

a=rand(2,6);
b=randn(2,6);
isequal(a,b)

在这里插入图片描述

② unique()函数

用于去除集合中的重复元素。

s=[3 3 1;4 3 9];
unique(s)

在这里插入图片描述
③ ismember()函数

一个集合中的哪些元素是另一个集合的成员,有种并集的感觉。

a=2:8;
b=2:2:9;
ismember(a,b)

在这里插入图片描述
④ 其他函数

a=1:9;
b=2:2:9;

union(a,b) %交集
intersect(a,b) %交集
setxor(a,b) %补集
setdiff(b,a) %b有,a没有的集合

在这里插入图片描述

十二、符号数学

本章介绍如何借助Matlab的符号数学工具箱来创建和使用符号变量、符号表达式和符号矩阵。

12.1 符号对象的创建和使用

12.1.1 创建符号对象和表达式

sym类是符号数学工具箱中定义的一种新的数据类型。sym类的实例就是符号对象,符号对象是一种新的数据结构,是用于存储代表符号的字符串。在符号数学工具箱中,用符号对象来表示符号变量、符号表达式和符号矩阵。
在一个Matlab程序中,sysms()函数规定和创建符号常量、符号变量、符号函数及符号表达式,利用class()可以测试建立的操作对象为何种操作对象类型以及是否为符号对象类型。

① 函数命令sym

函数命令sym的调用格式如下:

S=sym(A)
S=sym('A',[m,n])
S=sym('A',n)
S=sys(A,'real')
S=sym(A,'positive')
S=sym(A,'clear')
S=sym(A,flag)

其中,A用来建立一个符号对象S,其类型为sym。如果A(不带单引号)是一个数字、数值矩阵或数值表达式,则输出是讲数值对象转化为符号对象。如果A(带单引号)是一个字符串,则输出是将字符串转化成符号对象。

例如:

c=sym(2);
class(c)

② 函数命令 syms

函数命令syms的调用格式如下:

syms arg1 arg2 ...
syms arg1 arg2 ... real
syms arg1 arg2 ... clear
syms arg1 arg2 ... positive

syms命令可以建立三个或多个符号对象。例子如下:

syms a b c d;
class(c)

在这里插入图片描述

12.1.2 符号对象的基本运用

在Matlab中,符号计算表达式的运算符和数值计算中的运算符及基本函数几乎完全相同。
例如,输入函数表达式 f=x²+y²+z²+1 ,代码如下:

syms x y z;
f=x^2+y^2+z^2+1;
disp(f)

在这里插入图片描述


12.2 符号表达式的操作

12.2.1 替换

符号运算工具箱提供了subexpr()和subs()两个函数,用于实现符号对象的替换。可以通过符号替换来使表达式输出形式简化,从而得到简单的表达式。

① subexpr()函数
subexpr()函数将表达式中重复出现的字符串用变量替代,调用格式如下:

%指定用变量SIGMA的值来替代符号表达式中重复出现的字符串
%替换的结果由Y返回。
[Y,SIGMA]=subexpr(S,SIGMA) %SIGMA为符号对象
[Y,SIGMA]=subexpr(S,'SIGMA') %单引号中的SIGMA为字符串

例如:将复杂的表达式进行替换,求矩阵[a b;b a]的特征值和特征向量:

syms a b W
[V,D]=eig([a b;b a]); %V:特征向量矩阵。D:特征值
[RVD,W]=subexpr([V,D],W); %对矩阵元素中的公共子表达式进行替换表达
RVD

在这里插入图片描述
② subs()函数

subs()函数可以指定符号替换符号表达式中的某一特定符号,调用格式如下:

R=subs(S) %用工作空间中的变量值替换符号表达式S中的所有符号变量。如果没有指定某符号变量的值,则返回值中该符号变量不被替换。
R=subs(S,New) %用新符号变量New替代原来符号表达式中默认变量
R=subs(S,Old,New)%用新符号变量New替代原来符号表达式S中的变量Old

例如:

syms a b;
subs(a+b,a,5)

在这里插入图片描述

12.2.2 精度计算

① digits(d)

调用该函数后的近似解的精度变成d位有效数字。d的默认值是32。调用digits()可以得到当前数值计算的精度。

② vpa(A,d)

求符号A的近似解,该近似解的有效位数由参数d来指定。如果不指定d,则按照一个digits(d)指令设置的有效位输出

③ double(A)
把符号矩阵或任意精度表示的矩阵A转换为双精度矩阵。

例如:

A=[4.220 1.360 5.800;6.370 7.401 1.0;5.000 2.30 4.901];
S=sym(A);
disp(S)
digits(5) %转化为有效位为5的任意精度矩阵
vpa(S)
double(S)  %转化为双精度型矩阵

在这里插入图片描述

12.2.3 化简

Matlab符号工具箱提供了collect()、expand()、horner()、factor()、simplify()和simple()函数来实现符号表达式的化简,下面将分别介绍这些函数。

① collect()函数

collect()函数的功能是将符号表达式中同类项合并,其调用格式如下:

%将表达式中同次幂的项合并
R=collect(S) %S可以是表达式或符号矩阵

例如:

syms x
f=(x-1)*(x-2)^2;
collect(f)

在这里插入图片描述① expand()函数

expand()函数的作用是将表达式展开。调用格式如下:

%将表达式S中的各项展开,如果S包含函数,则利用恒等变形将它写成相应的和的形式。
%多用于多项式、三角函数、指数函数、对数函数
R=expand(S)

例如:

syms x y;
h=sin(x+y);
expand(h)	

在这里插入图片描述
③ horner()函数

horner()函数的功能是将符号表达式转化成嵌套形式,调用格式如下:

%将S中的每个多项式转化成嵌套形式
R=horner(S) %S为符号多项式矩阵

例如:

syms x y;
f=x^4+x^2+x;
horner(f)

在这里插入图片描述
——————(2023/3/19 17:30)————————
④ factor()函数

factor()函数是将符号多项式进行因式分解,调用格式如下:

%X为一个多项式或多项式矩阵,系数是有理数
%那么该函数将把X表示成系数为有理数的低阶多项式分解形式
%如果不能分解则返回X本身
factor(X)

例如:将多项式 x³-y³ 进行因式分解。

syms x y
factor(x^3-y^3)

在这里插入图片描述
⑤ simplify()函数

simplify()函数根据一定规则对表达式进行简化,调用格式如下:

%该函数很强,可以应用于包含和式、方根、分数的城防、指数函数、对数函数、三角函数、Bessel函数及超越函数等的表达式,其中S可以是符号表达式矩阵
R=simplify(S)

例如化简多项式:

syms x
S=(x^2+2*x+1)/(x+1);
simplify(S)

在这里插入图片描述
⑥ simple()函数

ps:这个函数在新版本已经被淘汰
simple()函数是寻找一个符号表达式的最简形式,调用格式如下:

r=simple(S)
[r,how]=simple(S) %r是最简符号表达式,how是描述化简方法的字符串

例如:

syms x
f=cos(x)^2+sin(x)^2;
f=simple(f);
disp(f)
g=cos(3*acos(x));
[g,how]=simple(g);
disp(g)
disp(how)

12.3 符号微积分的计算

12.3.1 极限和导数的符号计算

高数中的大多数微积分问题,都能用符号计算解决。

① limit()函数

函数limit(f,x,z)用于求极限:


其调用格式如下:

limit(f) %对x求趋于0的极限
limit(f,x,a) %对x求趋于a的极限
limit(f,x,a,left) %求x左趋于a的极限
limit(f,x,a,right) %求x右趋于a的极限

例如求极限:
在这里插入图片描述

l=limit((2-3/x)^2,x,1);
l

在这里插入图片描述

② diff()函数

diff()函数用于函数求微分,其调用格式如下:

diff(S,'v') % 将符号v视作变量,对符号表达式或符号矩阵S求取微分
diff(S,n) %将S中的默认变量进行n阶微分运算,默认变量可以用findsym()函数确定。
diff(S,'v',n) %将v视作变量,对符号表达式或矩阵S进行n阶微分运算

例子如下:

syms t x
g=[2*x t^2;t*cos(x) exp(x)];
diff(g,'x')

在这里插入图片描述

12.3.2 级数求和与积分的符号计算

高数的知识,求积分的过程就是累计和的过程,在介绍符号积分之前要先了解一下级数求和。

① symsum()函数
symsum()函数用于对表达式进行求和。其调用格式如下:

r=symsum(s,a,b) %求符号表达式s中默认变量从a到b时的有限和,s为级数的通项公式
r=symsum(s,v,a,b) %求符号表达式s中变量v从a变到b时的有限和

例子如下:
求1+1/2²+1/3²+…+1/k² 和 1+x+x²+…x^k的和

syms x k
s1=symsum(1/k^2,1,10);
s2=symsum(1/k^2,1,inf);
s3=symsum(x^k,k,0,inf);
disp(s1)
disp(s2)
disp(s3)

在这里插入图片描述
② int()函数

int()函数用于求符号表达式的积分,调用格式如下:

R=int(S) %用默认变量求S的不定积分
R=int(S,v) %用符号v求符号表达式的不定积分
R=int(S,a,b) %默认变量a到b的定积分
R=int(S,v,a,b) %v从a到b的定积分

例子如下:

syms t x
g=[2*x t^2;t*cos(x) exp(x)];
s1=int(g);
s2=int(g,'t');
s3=int(g,sym('a'),sym('b'));
disp(s1)
disp(s2)
disp(s3)

在这里插入图片描述


12.4 符号计算

12.4.1 符号矩阵的加减运算

例子如下:

syms a b
A=[a b;b a];
B=[2*a b;b 2*a];
A+B

在这里插入图片描述

12.4.2 对矩阵求若尔当典范形

使用jordan()函数,其调用函数如下:

J=jordan(A) %计算A的若尔当典范形
[V,J]=jordan(A) %V为相应的变换矩阵

例子如下:

A=sym([1 2 -3;1 2 5;2 4 -5]);
[V,J]=jordan(A);

在这里插入图片描述

12.4.3 求线性方程组的解
syms x y z
a=x^2+2*x+1;
b=x+3*z-4;
c=y*z+1;
[x,y,z]=solve(a,b,c);
[x,y,z]

在这里插入图片描述

————————(2023/3/19 22:36)————————


十三、矩阵计算

13.1 线性方程组

13.1.1 直接法求解线性方程组

① “\”运算符求解

在Matlab中用运算符 “\” 求解线性系统,这个运算符的功能很强大,直接利用该运算符即可求线性方程组的解。如下:

% A是nxm矩阵,b和x是有n个元素的列向量。
x=A\b

求方程组的 一个特解

2x1+x2-x3-x4=3
x1-x2-3x3+4x4=4
x1+5x2-2x3-4x4=1

A=[2 1 -1 -1;
    1 -1 -3 4;
    1 5 -2 -4];
B=[3 4 1]';
X=A\B;
disp(X)

在这里插入图片描述

② 借助逆矩阵求解

对于线性方程组AX=b,只要矩阵A非奇异,就可以通过矩阵A的逆矩阵求解,即x=A﹣¹b。使用inv()函数求逆矩阵,或者直接对矩阵求-1次方即A^-1。
例子如下:
求方程的解:

x1+x2=1
2x1+4x2=2

A=[1 1;2 4];
b=[1;2];
x=inv(A)*b;
x

在这里插入图片描述

13.1.2 间接法求解线性方程组

间接法是通过LU分解将矩阵进行转化,再进行计算,可大大提高运算速度。

LU分解可把任意方阵分解为下三角矩阵的基本变换形式和上三角矩阵的乘积。即A=LU,L为下三角阵,U为上三角阵。线性方程组AX=b就变成了LU*X=b,所以X=U(L\b)。

Matlab提供了LU分解函数,调用格式如下:

[L,U]=lu(A)

例子如下:求解方程组的一个特解:

x1+x2-x3=6
2x1-x2+3x3=7
4x1+5x2=8

A=[1 1 -1;2 -1 3; 4 5 0];
B=[6 7 8]';
[L,U]=lu(A);
X=U\(L\B);
X

在这里插入图片描述

13.2 矩阵函数

13.2.1 求矩阵的特征值和特征向量

在Matlab中用函数eig()求特征值和特征向量,其调用格式如下:

d=eig(A)%返回矩阵A的所有特征值
[V,D]=eig(A)%返回特征值和特征向量,AV=VD
[V,D]=eig(A,'nobalance') %输入数值很小时用这个
d=eig(A,B) % 返回A,B的广义特征值
[V,D]=eig(A,B) %返回广义特征值特征向量
[V,D]=eig(A,B,flag)    %flag='chol'时计算广义特征值通过B的Cholesky分解进行;flag='qz'时,采用QZ分解

例子如下:

A=[1 2 3;4 5 6;7 8 9];
[V D]=eig(A)

在这里插入图片描述

13.2.2 矩阵函数汇总

见下表:

函数或运算符 描述
/和\ 矩阵的左除和右除,用于求解线性方程组
accumarray(ind,val) 利用累加创建数组
A^n 求A的n次幂,A^3=AAA
balance(A) 将A进行缩放提高特征值的精度
[V,D]=cdf2rdf(V,D) 将复数对角矩阵转化为两个实数对角矩阵
chol(A) 将A进行Cholesky因式分解
cholinc(A,DropTol) cholinc(A,Options) 将A进行不完全Cholesky分解
choluodate(R,X) Cholesky因式分解的秩1升级
cond(A) 利用奇异值分解求A的条件数
condest(A) 求A的范数1的条件估计
[V,D,s]=condeig(A) 求的与重复特征向量相对应的条件数
det(A) 求矩阵的行列式
dmperm(A) 对A进行Dulmage-Mendelsohn排列
eig(A) 求矩阵的特征值和特征向量
[V,D]=eig(A) 求A的特征向量矩阵V和特征对角矩阵D
expm(A) 矩阵指数函数
funm(A) 矩阵通用函数
gsvd(A,B) 求A的广义奇异值
[U,V,X,C,S]=gsvd(A) 对A进行广义奇异值分解
hess(A) 对A的Hessenburg标准型
inv(A) 求A的逆
limsolve(A,y,options) 快速求解Ax=y,其中A的结构由options给定
logm(A) 矩阵对数运算
lscov(A,y,V) 已知数据的协方差矩阵(V),求线性方程组的最小二乘解
lsqnonneg(A,y) 求线性方程组的非负最小二乘解
[L,U,P]=lu(A) 对矩阵A进行LU分解
minres(A,y) 利用最小残差法求线性方程组的解
norm(A,type) 求矩阵或向量(由type指定)的范数
null(A) 求A的零空间
orth(A) 求A的正交空间
pinv(A) 求A的伪逆矩阵
planerot(X) 对X进行平面旋转
poly(A) 求A的特征多项式
polyeig(A0,A1,…) 多项式的特征值解
polyvalm(A)求A的矩阵多项式
qr(A) 对A进行正交三角分解
qrdelete(Q,R,J) 从QR分解中删除行或列
qrinsert(Q,R,J,X) 从QR分解中插入行或列
qrupdate(Q,R,U,V) Cholesky因式分解的秩1升级
qz(A,B) 广义特征值问题求解
rank(A) 利用奇异值分解求A的秩
rcond(A) 对A进行LAPACK倒数条件估计
rref(A) 将矩阵A变换为行阶梯形
rsf2csf(A) 将A由实块对角阵转化为复块对角阵
schur(A) 对A进行Schur分解
sqrtm(A) 求A的平方根
subspace(A,B) 求两个子空间A和B之间的角度
svd(A) 求矩阵A的奇异值
[U,S,V]=svd(A) 对A进行奇异值分解
trace(A) 求矩阵A的迹(对角元素的和)

下面列举一些函数的用法:

A=[1 2 3;4 5 6;7 8 9];
r1=rank(A); %行列式的值
r2=trace(A); %矩阵的迹
disp(r1)
disp(r2)

在这里插入图片描述


13.3 非线性矩阵的运算

介绍有关非线性矩阵的求解过程,对于非线性矩阵运算函数如下表:

函数名 功能描述
expm 矩阵指数运算
logm 矩阵对数运算
sqrtm 矩阵开平方运算
funm 一般非线性矩阵运算

————————(2023/3/20/ 13:58)————————

十四、数理统计

14.1 概率分布

Matlab提供了5个函数分别是概率密度函数、累积分布函数、逆累积分布函数、随机产生器与方差计算函数。下面分别介绍几种常见函数的使用。

14.1.1 常用概率分布函数

① 概率密度函数——pdf()函数

其调用格式如下:

Y=pdf('Name',X,A1,A2,A3)
  • Name为特定的分布名称,首字母必须大写;
  • X为分布函数自变量取值矩阵;
  • A1、A2、A3分别为相应分布的参数值;
  • Y存放结构,为概率密度矩阵。

例如:计算一个正态分布的概率密度分布值,代码如下:

y=pdf('Normal',-4:4,0,1);
disp(y)

在这里插入图片描述② 累积分布函数——cdf()

其调用格式如下:

p=cdf('Name',X,A1,A2,A3)

其中的参数设置与pdf()函数相同。

例如:计算一个正态分布的累积分布值。

y=cdf('Normal',-4:4,0,1);
disp(y)

在这里插入图片描述

14.1.2 常用的分布函数列表
分布名 分布函数
正态分布 [m,v]=normstat(mu,sigma)
超几何分布 [mn,v]=hygestat(M,K,N)
几何分布 [m,v]=geostat§
Gamma分布 [m,v]=gamstat(A,B)
F分布 [m,v]=fstat(v1,v2)
指数分布 [m,v]=expstat(mu)
Chi-squrare分布 [m,v]=chi2stat(nu)
二项分布 [m,v]=binostat(N,P)
连续均匀分布 [m,v]=unistat(A,B)
离散均匀分布 [m,v]=unidstat(N)
t分布 [m,v]=tstat(nu)
泊松分布 [m,v]=poisstat(lambda)

——————(2023/3/21 21:05 )—————————


十五、多项式

15.1 多项式的运算

15.1.1 多项式的表示

Matlab用行向量来表示多项式,将多项式的系数按照降幂次存放在行向量中。
如:描述一个6次幂多项式,代码如下:

poly2sym([1 -2 0 8 0 6 -8])

在这里插入图片描述若是计算上述多项式在x=1处的值:

val= polyval([1 -2 0 8 0 6 -8],1);

在这里插入图片描述

15.1.2 多项式的加减法

Matlab没有提供专门的函数来执行多项式的加法。如果两个多项式向量长度相等可以直接将两个多项式向量相加。如:

a=[0 1 2 1];
b=[3 0 1 1];
c=a+b;
d=a-b
poly2sym(c)
poly2sym(d)

在这里插入图片描述

15.1.3 多项式乘除法

由于多项式的乘法实际上就是多项式系数向量之间的卷积运算,这样可以直接使用Matlab提供的卷积函数conv()来完成多项式的乘法,其调用格式如下:

w=conv(u,v) %u和v的卷积,代数上相当于多项式u乘上多项式v

例子如下:

计算x²+2x+1和3x²+x+1的乘积

a=[1 2 1];
b=[3 1 1];
c=conv(a,b);

在这里插入图片描述
多项式除法由deconv()函数实现,调用格式如下:

[q,r]=deconv(v,u) %实现解卷积的操作,实现多项式v除以多项式u,得到商q和余多项式r

例子如下:

计算3x^3+x+1除以x²+2x+1

a=[3 0 1 1];
b=[1 2 1];
[q,r]=deconv(a,b)

在这里插入图片描述


15.2 多项式的根

求多项式的根,即多项式等于0的解。在Matlab中使用roots()来求多项式的根,根通常用列向量表示。调用格式如下:

r=roots(c) %返回多项式c的所有根r

例如:

求x²+2x+1的根

p=[1 2 1];
r=roots(p)

在这里插入图片描述
Matlab还提供了通过多项式的根反向构建相应的多项式,实现函数为poly()函数从一个根向量构建一个多项式向量。调用格式为:

p=poly(r) %r为多项式的所有根,p为多项式的行向量形式
p=poly(A) %A为方阵,根据A的特征值求特征多项式p

例子如下:

p=poly([-1 -1])

在这里插入图片描述


15.3 多项式部分分式展开

函数residue()可以将多项式之比用部分分式展开,也可以将一个部分分式表示为多项式之比。调用格式如下:

[r,p,k]=residue(b,a)

解释下上述参数的意思:求b/a的部分展开式,返回值r是部分分式的柳树,p是部分分式的几点,k是直接项(余数)。如果多项式a没有重根,其格式如下:

在这里插入图片描述其中向量r,p的长度和a,b的长度有以下关系:

length(a)-1=length(r)=length(p)

当向量b的长度小于a时,向量k中没有元素,否则应满足以下关系:

length(k)=length(b)-length(a)+1
[b,a]=residue(r,p,k)

例子如下:

求x²+2x+1与多项式3x^3+x+1之比的部分展开式:

a=[3 0 1 1];
b=[1 2 1];
[r,p,k]=residue(b,a)

在这里插入图片描述


15.4 多项式的导数和积分

对于多项式可以使用polyder()来计算多项式的导数,其调用格式如下:

k=polyder(p) %返回多项式p的导数
k=polyder(a,b) %返回多项式a与多项式b乘积的导数
[q,d]=polyder(b,a) %返回多项式a除以b的商数的导数,并以q/d格式表示

例子如下:

a=[3 0 1 1];
h=polyder(a)

在这里插入图片描述在Matlab中使用polyint()来计算多项式的积分,调用格式如下:

polyint(p,k) %返回多项式p的积分,设积分的常数项为k
polyint(p) %设积分的常数项为0

例子如下:

polyint([9 0 1],1)

在这里插入图片描述


15.5 多项式曲线拟合

函数polyfit()采用最小二乘法对给定数据进行多项式拟合,最后给出拟合多项式的系数,调用格式如下;

p=polyfit(x,y,n) %采用n次多项式p来拟合x和y从而使p(x)与y的最小均方差最小

例如

x=(0:0.1:2.5)'; %拟合用的x
y=erf(x);
p=polyfit(x,y,6); %六次多项式拟合
f=polyval(p,x);
figure(1)
plot(x,y,'o',x,f,'-')
x=(0:0.1:5)'; %测试用的x
y=erf(x);
f=polyval(p,x);
figure(2)
plot(x,y,'o',x,f,'-')
axis([0 5 0 2])

在这里插入图片描述在这里插入图片描述
———————(2023/3/20 20:40 看论文去了)———————


十六、微积分

16.1 微分

16.1.1 导数

Matlab提供了一个函数diff()来近似计算一个描述了某个该函数的数据列表的近似导数。diff()函数实际上是通过计算数组中相邻元素之间的差值来估算导数的。其调用函数如下:

Y=diff(X) %X 是矩阵或者一维向量
Y=diff(X,n) %n是求导次数
Y=diff(X,n,dim) %dim是X的维数

例如:

x=[0,1,2,3,4,5,6];
diff(x)

在这里插入图片描述
求 y=cos(x) 的导数:

x=linspace(0,2*pi);
y=cos(x);
dydx=diff(y)/(x(2)-x(1));
xx=x(2:end);
plot(x,y,xx,dydx)
16.1.2 梯度

求梯度的函数为gradient(),其调用格式如下:

FX=gradient(F) %F为一维向量,返回的值FX是F的梯度
[FX,FY]=gradient(F) %F是一个矩阵,FX和FY分别对应F对X和Y的偏导数

求 f(x-y)e^(-x²-y²) 的梯度

v=-2:0.2:2;
[x,y]=meshgrid(v);
z=exp(-x.^2-y.^2);
[Fx,Fy]=gradient(z);
contour(v,v,z),hold on %绘制等值线
quiver(v,v,Fx,Fy), hold off %绘制箭头梯度图,箭头越长,梯度越大

在这里插入图片描述

16.2 积分

Matlab提供了三个函数:integral()、dblquad()和triplequad()来求数值积分。

16.2.1 integral()函数——一重积分

调用格式如下:

q=integral(fun,a,b) %fun是函数句柄,a和b是x下限和上限

例子如下:
计算:∫(0->2) (x^2-2)dx

fun=@(x) x.^2-2;
Q=integral(fun,0,2)

在这里插入图片描述

16.2.2 integral2()函数——二重积分

integral2()函数的调用格式如下:

q=integral2(fun,xmin,xmax,ymin,ymax)

例如:

fun=@(x,y) x.^2+y.^2;
Q=integral2(fun,0,4,0,2);

在这里插入图片描述

16.2.3 integral3()函数——三重积分

其调用格式如下:

q=integral3(fun,xmin,xmax,ymin,ymax,zmin,zmax)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB入门到精通(三):常用函数及数学应用 的相关文章

  • 对外部程序的非阻塞调用,不会丢失返回码

    当从 Matlab 中启动外部程序 为了简洁起见 我们将其称为 EX 时 我可以这样做 status result system EX exe 它将阻塞直到 EX 返回 或者像这样 status result system start EX
  • Matlab cellfun 上的函数 strfind

    我想用cellfun功能于strfind函数在另一个字符串元胞数组中查找字符串元胞数组中每个字符串的索引 以将它们排除在外 strings aaa bbb ccc ddd eee fff ggg hhh iii jjj excludedSt
  • 分析 mex 函数

    我刚刚用 c 将 Matlab 程序重写为 mex 函数以加快速度 并取得了出色的结果 这个优化决策是一个非常非常好的主意 无需线程即可将速度提高 20 倍 它仍然让我很好奇 mex 函数将时间花在什么上 并希望找出可能的瓶颈 我正在寻找一
  • 使用正则表达式清除工作区中的变量(例外)

    我想清除工作区中的所有变量 但有一些由正则表达式定义的例外 功能clear有一个附加选项 regexp clear regexp expr1 exprN清除与任何一个匹配的所有变量 列出的正则表达式 该选项仅清除变量 所以我正在寻找相反的东
  • Matlab多核

    我正在运行一种占用大量资源并最大化 CPU 的算法 问题是它只使用一个CPU 我怎样才能使MATLAB多线程计算并使用超过1个CPU 除非您专门使用并行结构 即使用显式并行性 或使用已经为您并行化的内置函数 否则 Matlab 将不会在多核
  • 用由少量元素组成的向量平滑曲线?

    我有 4 条曲线 由这些向量表示 x 300 700 1000 1500 y1 1 0055394199673442 0 11221578805214968 1 502661406039569 1 0216939169819494 y2 1
  • 如何在 Matlab 中使用变化的输入/时间相关的输入函数求解 DAE?

    我正在使用 ode15i 求解器求解 DAE 问题 我有 8 个变量和 8 个方程 系统很复杂 到目前为止唯一可用的求解器是 ode15i 我使用过该指南 http se mathworks com help symbolic set up
  • 在 MATLAB 中将数组拆分为多个部分

    我想将数组分成相等的部分 如下所示 a 1 2 3 4 5 6 7 8 9 10 n 2 b split a n b 1 2 3 4 5 6 7 8 9 10 哪个函数可以做到这一点 尝试这个 a 1 2 3 4 5 6 reshape a
  • 在 GUI 内的子图中添加滚动条

    如何向子图添加滚动条 我已经阅读了很多教程 但它们似乎很难理解 例如 滚动图形演示 http www mathworks com matlabcentral fileexchange 5253 scrolling figure demo 有
  • 具有表面梯度的颜色 matplotlibplot_surface 命令

    我想将 surf 命令从MATLAB到plot surface命令中绘图库 我面临的挑战是使用时cmapplot surface 命令中的函数用渐变为表面着色 这里是matlab script Matlab Commands x 5 25
  • Matlab:通过扩展向量来扩展矩阵

    我有一个dxmxn matrix A 解释 对于每个n 有m维度向量d 我想将每个 d 维向量扩展如下 考虑一个向量v维度 d 1 2 d 它是 x 1 x 2 x d 但为了简单起见 我删除了 x 目标是延长v获得一个d d向量形式 1
  • ND 输入的 im2col 算法

    我正在尝试为输入维度 gt 2D 编写自己的 im2col 算法 目前我正在研究 Matlab im2col 的实现 但是 我找不到任何有关二维以上输入的情况的文档 如果我将 3D 张量输入到函数中 我确实会得到输出 不过我不太明白你是如何
  • DYMOLA:opc 服务器如何使用 MATLAB 使用 dsin.txt 或 mat 文件进行初始化

    我在 DYMOLA 中创建了一个 OPC 服务器 现在我在 DYMOSIM 中有这个可以单击并初始化 使用 dsin txt 的 MAT 文件 现在我在 MATLAB 中创建了一个 GUI 文件 并获取变量的输入并创建了一个 mat 文件
  • SPMD 与 Parfor

    我对 matlab 中的并行计算很陌生 我有一个创建分类器 SVM 的函数 我想用几个数据集来测试它 我有一个 2 核工作站 所以我想并行运行测试 有人可以向我解释一下以下之间的区别 dataset array dataset1 datas
  • iOS 将 URL 中的音频分成帧

    我正在 iOS 上开发一个简单的网络广播应用程序 具有非常简单的语音 音乐识别功能 主要思想是一个收音机 它播放来自 url 的信号 同时检查正在广播的信号类型 当它检测到语音时 它会改变频道等等 我使用 Storyboards 和 AVF
  • 如何绘制 NxN 圆数组?

    我想绘制一个 NxN 的圆数组 为了形象化 我附上了我想要实现的目标的图像 我是 MatlLab 的新手 所以我尝试先绘制一个圆 下面是示例代码 n 2 10 size of mask M zeros n I 1 n x I n 2 mas
  • 当 MATLAB 发生错误时如何继续循环?

    我正在使用函数将一些 dat 文件转换为 mat 文件 我在循环内调用此函数来转换多个文件 在某些情况下 我的 dat 文件已损坏 函数无法转换并发生错误 从而停止循环 现在我的问题是 是否有任何命令 当错误发生时 它应该跳过循环中的当前
  • 读取 MEX 文件中的 4D 数组

    我在 MATLAB 中有一个 4 维数组 我正在尝试访问 MEX 函数中的数组 下面创建 testmatrix 一个 4 维矩阵 已知数据为uint8 type Create a 4D array 2x 2y rgb 3 framenumb
  • MATLAB 引擎函数的输入参数

    我正在尝试使用 MATLAB 引擎在 Python 中调用 MATLAB 函数 但遇到一些问题 在设法将 NumPy 数组作为函数的输入处理后 现在 MATLAB 出现一些错误 MatlabExecutionError 未定义输入函数 si
  • 在 MATLAB 中绘制圆

    我被要求找到在 MATLAB 中绘制圆的不同方法 看起来很无聊 不过我可以想出一些想法 有些可能效率低下 Method 1 ezpolar x 1 Method 2 t linspace 0 2 pi 100 plot sin t cos

随机推荐