Matlab学习

第九章

2.subs函数

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

R=subs(s)%用工作空间中的变量值替代符号表达式s中的所有符号变量

R=subs(S,New)%用新符号变量New替代原来符号表达式S中的默认变量

R=subs(S,Old,New)%用符号变量New替代原来符号表达式S中的变量Old【9 7】替换函数subs

应用示例
syms a b t;
subs(a^2+a*b+8,a,1)  %将a^2+a*b+8中的a替换为1
subs(exp(a*t),'a',-magic(2))  % magic函数应用:生成一个n*n阶的魔方矩阵,即每行每列、对角线和都相等

9.1.4符号表达式的化简

collect函数(就是用来合并同类项的)

功能:将符号表达式中的同类项合并

调用格式:R=collect(S) %合并表达式S中相同次幂的项。S可以是表达式,也可以是符号矩阵

                  R=collect(S,v) %合并表达式S中具有V 次幂的项。不指定v,则合并所有x相同次幂的项

expand函数 (将里面的式子展开)

expand(cos(x+y)) %将三角函数展开,=cosx*cosy-sinx*siny

horner(f) 函数(将多项式转换成嵌套形式 就是跟collectsyms x y;horner(f)差不多的 提公因式)

syms x y

f=x^3-6*x^2+11*x-6;

horner(f)

factor函数

(对多项式进行因式分解)

simplify函数

(按照特定要求化简式子)

M=[(x^2+5*x+6)/(x+2),sin(x)*sin(2*x)+cos(x)*cos(2*x);
    (exp(-x*1i)*1i)/2-(exp(x*1i))/2,sqrt(16)];
S=simplify(M)

sqrt函数

(就是开根号 求平方根的)

digits(d)

%将近似解的精度调整为d位有效数字,d默认为32,为空时,得到当前采用的精度

vpa(A,d)

                        %求符号解A的近似解,该近似解的有效数位由参数d指定

                      %如果不指定d,则按照一个digits(d)指令设置的有效位数输出

double(A) 

%把符号矩阵或任意精度表示的矩阵A转换成双精度矩阵

A=[3.100 1.300 5.500;4.978 4.400 1;9.000 2.90 4.61];
S=sym(A) %就是说
digits(6)%转换成有效位数为6的任意精度的矩阵
vpa(S)

9.2符号微积分及其变换

1.diff函数

(就是求导数着呢 后面有个数就是 让求几阶导)

调用格式:

Y=diff(X)             %对符号表达式或符号矩阵X求微积分 

Y=diff(X,n)          %对X中的默认变量进行n阶微分运算

Y=diff(X,n,dim)    %对符号表达式或者矩阵X沿dim指定的维进行n阶微分运算

2.jacobian函数

注意:第一个参数必须是行向量 第二个参数必须是列向量。

limit函数

limit(F,x a)    %求当→a时符号表达式F的极限

limit(F,a)      %F采用默认自变量,求F的自变量趋近于a时的极限值

limit(F,x,a,'left')  %求F的左极限,即自变量从左趋近于a时的函数极限值

limit(F,x,a,'right')  %求F的右极限,即自变量从右边趋近于a时的函数极限值

sysum函数 

级数求和   例如\sum_{k=1}^{10}K^2

r=sysum(s,v,a,b)   %求符号表达式s中的变量v从a到b的和

r=symsum(s,a,b)  %求符号表达式s中的默认自变量从a到b的和

r=symsum(s,v)    %求符号表达式s中的变量v从0到v-1的和

Taylor函数 

利用已知函数的不同阶导数的组合近似地逼近函数。

调用格式:T=taylor(f)       %返回符号表达式f在默认变量=0处做5阶Taylor展开时的展开式

                  T=taylor(f,v)         %返回符号表达式f在v=0处做5阶Taylor展开时的展开式

                   T=taylor(f,v,a)        %返回f在v=a处做5阶Taylor展开的展开式

                   T=taylor(f,v,'Order',n)  %返回f的n-1阶麦克劳林级数展开式

                                                        %即在v=0处做Taylor展开,f以符号标量v作为自变量

int函数

(用来求符号表达式的积分)

调用格式:R=int(S)  %用默认变量求符号表达式S的不定积分值,默认变量可用函数findsym确定

                  R=int(S,v) %用符号标量v作为变量求符号表达式S的不定积分值

                  R=int(S,a,b)  %符号表达式采用默认变量,该函数用来求默认变量从a变到b时的符号表达式

                 R=int(S,v,a,b)  %求当v从a变到b时符号表达式S的定积分值,S采用符号标量v作为变量

%【9 21】求积分
syms x y;
int(sin(x),0,pi)

%【9 22】求二重积分
syms x y;
int(int(x^2+y^2,x,x^2),x,y)

9.3_符号矩阵的计算

Fourier变换及其反变换

fourier和ifourier函数的使用方法

Fw=fourier(ft,t,w)  %求时域函数ft的Fourier变换Fw

ft=ifourier(Fw,w,t)  %求频域函数Fw的Fourier反变换

(其中,ft是以t为自变量的时域函数,Fw是以圆周率w为自变量的频域函数)

Laplace变换及其反变换

Fs=laplace(ft,t,s)   %求时域函数ft的Laplaec变换Fs

ft=ilaplace(Fs,s,t)  %求频域函数Fs的Laplace反变换ft

(其中,ft是以t为自变量的时域函数,Fs是以复频率s为自变量的频域函数)

%【9 24】求Laplace变换及其反变换
syms t s;
syms a b positive; %posive正数  复数(unreal )实数(real)
Mt=[dirac(t-a),heaviside(t-b);exp(-t)*sin(b*t),cos(t)];
%dirac和heaviside分别为单位脉冲函数和单位阶跃函数
MS=laplace(Mt,t,s)%拉普拉斯变换
ft=ilaplace(MS,s,t)%反变换

一个序列的Z变换及其反变换

Hibert(希尔伯特矩阵)

 【9 25】求函数的Z变换及其反变换
clear ,clc
syms a b t z n
f=(exp(-(b*t))-exp(-(a*t)))/(a-b);
Fz=ztrans(f)
Fz=iztrans(Fz,z,n)

【9 26】符号矩阵的加减运算
syms a b c d
A=sym([a b;c d]);
B=sym([2*a b;c 2*d]);
A+B
A*B

【9 27】线性代数运算示例
H=hilb(6); %生成6阶的希尔伯特矩阵
H=sym(H) %将数值矩阵转换为符号矩阵
inv(H)  %求符号矩阵的逆矩阵
det(H)  %求方阵A行列式的值

E=eig(A) 

%求符号方阵A的服啊后特征值E

[v,E]=eig(A)

%返回方阵A符号特征值E和相应的特征向量v

%【9 28】求上例中矩阵H的特征值和特征向量
H=hilb(6); %生成一个六阶希尔伯特矩阵
H=sym(H);%将数值矩阵转换为符号矩阵(就是一堆数字转成分数了)
[v,E]=eig(H) %v的每一列是H的一个特征向量,E的对角线元素是H的特征值


J=jordan(A) 

 %计算矩阵A的约当标准型。其中A可以是数值矩阵或符号矩阵

[V,J]=jordan(A)

%除了计算矩阵A的约当标准型J,还返回相应的变换矩阵V

%【9 29】计算矩阵的约当标准型。
A=sym([1 2 -3;1 2 5;2 4 -5]);%定义符号矩阵
[V,J]=jordan(A)

S=svd(A) 

%给出符号矩阵奇异值对角矩阵,其计算精度由digits函数指定

[U,S,V]=svd 

%输出参数U和V是两个正交矩阵,他们满足关系是A=USV‘

rng default 

%就是在matlab启动时会用默认的随机数生成器生成0-1之间的伪随机数

%【9 30】求矩阵A的奇异值分解
rng default %设置种子数,方便复现
X=rand(6,6); %生成6*6的随机矩阵
X=sym(X);  %将数值矩阵转换成符号矩阵
digits(12)  %指定输出精度
S=svd(vpa(X)

9.4_符号方程求解

代数方程的求解

solve

调用格式:S=solve(eqn,var) %方程eqn的解,自变量由var指定

                  S=solve(eqn,var,Name,Value)%使用由一个或多个名称-值参数对指定的其他选项  

                  Y=solve(eqn,vars) %求方程组eqns的解,并返回解的结构体,自变量由vars指定

                  Y=solve(eqns,vars,Name,Value)%使用由一个或多个名称-值参数对指定的其他选项

                   [y1,..,yN]=solve(eqns,vars)%将解分配给变量y1,...,yN

(其中,未指定var或var时,由symvar函数确定要求解的变量,symvar找到的变量的数量等于方程eqns的数量)。

%【9 31】求方程的解
syms a b c x
eqn=a*x^2+b*x+c==0
S=solve(eqn)

%【9 32】求线性方程组的解

【9 32】求线性方程组的解
A=sym([1 1/4 1/6 -1;1 1 -1 1;1 -1/2 -1 1;-1 -1 1 1]);
b=sym([0;1;0;2]);
x1=A\b;      %直接利用solve求解

syms d n p q ;   %用solve求解
eqns=[d+n/4+p/6==q,n+d+q-p==1,q+d-n/2==p,q+p-n-d==2];
Y=solve(eqns)

%【9 33】求方程组关于x和y的解
syms x y u v w
eqn1=u*y+v*x+2*w==0;
eqn2=y+x-w==0;
eqns=[eqn1 eqn2];
vars=[x y];
Y=solve(eqns,vars)

dsolve函数

求常微分方程的符号解)

调用格式:S=dsolve(eqn)  %求解微分方程eqn,其中eqn是一个符号方程

                   S=dsolve(eqn,cond)  %用初始或边界条件cond求解方程eqn

                   S=dsolve(___,Name,Value)  %使用由一个或多个名称-值参数对指定其他选项

                   [y1,...,yN]=dsolve(___)  %将解分配给变量y1,...,yN

%【9 34】求微分方程的解


%xSol=dsolve('Dx=a*x','x(0)=s')%旧版输入方式 即将淘汰

syms x(t) a;
eqn=diff(x,t)==a*x;
cond=x(0)==5;
xSol(t)=dsolve(eqn,cond)

%【9 35】求微分方程的解

syms x(t) a b;
eqn=diff(x,t,2)==a^2*x;
Dx=diff(x,t);
cond=[x(0)==b,Dx(0)==1];%在x0=b处,以及x0导数=1处
xSol(t)=dsolve(eqn,cond)


%【9 37】求边值问题的解

S=dsolve('Df=2*f+3*g,Dg=f+g','f(0)=1,g(0)=0');%旧版输入方式

syms f(x) g(x);
eqns=[diff(f,x)==2*cond=[f(0)==1,g(0)==0];

cond=[f(0)==1,g(0)==0];
dsolve (eqns,cond)
 

9.5_可视化数学分析窗口

funtool:在命令行窗口中输入会出现三个图 关闭任意一个其他的都会关闭

taylor:在命令行输入taylor 出现泰勒工具箱

第十章 数值计算

10.1_线性方程组的解法

求特解的直接求法:

%【10 1】求方程组的一个特解
A=[1 3 -3 -1;3 -6 -3 4;1 5 -9 -8];
B=[1 4 0]'; %进行了转置(因为是个列向量)
X=A\B  % 跟/不一样 是反的

求解方程组:

%【10 2】求方程组的解(矩阵是奇异的 所以会报错)
A=[1 2;3 4];b=[-1;-1];
x=A^-1*b                         %也可以采用x=inv(A)*b
A=[1 2;2 4];b=[-1;-1];
x=A^-1*b

用lu分解法求方程组特解

%【10 3】用lu分解法求方程组特解

%【10 3】用lu分解法求方程组特解
A=[4 2 -1;3 -1 2;11 3 1];
B=[2 10 8]';    %忘记转置了
D=det(A)    %det求行列式
[L,U]=lu(A)
X=U\(L\B)   %和/是反的 跷跷板

%【10 4】利用Jacobi迭代法及Gauss-Seidel迭代法求方程组的解

function jacobi(A,B,P,delta,max1)
%A-系数矩阵;B-常规项;P-初始值;delta-允许误差,max1-最大迭代次数
N=length(B);
for k=1;max1
    for j=1:N
        X(j)=(B(j)-A(j,[1:j-1,j+1:N])*P([1:j-1,j+1:N]))/A(j,j);
    end
    err=abs(norm(X'-P));
    relerr=err/(norm(X)+eps);
    P=X';
    k;P;
    if (err<delta)|(relerr<delta)
        break
    end
end

X=X'

%【10 4】利用Jacobi迭代法及Gauss-Seidel迭代法求方程组的解
A=[3 1 -1;4 8 1;3 1 6];
B=[6 -20 15]';
x0=[1 2 1]';%设定初始值
jacobi(A,B,x0,1e-5,50);

A=[3 1 -1;4 8 1;3 1 6];
B=[6 -20 15]';
x0=[1 2 1]';
gseid(A,B,x0,1e-5,60);%也是调用自己写的函数

10.2.1插值

拉格朗日插值:

函数实现数据插值

(1)一维数据插值 interp1 调用格式

vq=interp1(x,v,xq)  %使用线性插值返回一维函数在特定查询点的插入值

vq=interp1(x,v,xq,method)  %指定备选插值方法

vq=interp1(x,v,xq,method,extrapolation)  %指定外插策略计算落在x域范围外的点

(其中,向量x包含样本点,v包含对应值v(x),向量xq包含查询点坐标。如果有多个在同一点坐标采样的数据集,则可以将v以数组的形式进行传递。数组v的每一列都包含一组不同的一维样本值)。

method指定备选插值方法,包括:'linear'(默认)、’nearest‘、’next‘、’previous‘、’pchip‘、’cublic‘、’v5cubic‘、’makima‘或’spline‘。

一维数据插值求点matlab自带的插值函数interp1的几种插值方法-腾讯云开发者社区-腾讯云

%【10 5】在给出函数的40个函数值,利用一维数据插值求点的值,并验证
x=linspace(0,2*pi,40);
y=cos(x.^2);
val=interp1(x,y,[0 pi/2 3]) %用interp1计算中间点的函数值
cor=cos([0 pi/2 3].^2) %与用cos计算得到的正确结果进行比较
 

(2)二维数据插值

二维数据插值函数为interp2,调用格式如下:

Vp=interp2(X,Y,V,Xq,Yq)                   %使用线性插值返回双变量函数在特定查询点的插入值

(X和Y包含样本点的坐标,V包含各样本点处的对应函数值,Xq和Yq包含查询点的坐标。结果始终穿过函数的原始采样数据)

Vq=interp2(V,Xq,Yq)                  %假定一个默认的样本点网络

Vq=interp2(V)                 %将每个维度上样本值之间的间隔分割一次形成优化网络,并返回插入值

Vq=interp2(V,k) %           % 将每个维度上样本值之间的间隔反复分割k次形成优化网络

                                        %并在这些网络上返回插入值,即在样本值之间生成2……k-1个插值点

Vp=interp2(___,method)   %指定备选插值方法

Vp=interp2(___,method,extrapval)  %指定标量值extrapval

(说明:method插值方法有’linear‘(默认),'nearest','cubic','makima',或者’spline‘.etrapval为处于样本点域范围外的所有查询点赋予该标量值,如果省略extrapval参数,则对于’spline‘和’makima‘方法返回外插值,对于其他内插方法返回NaN值。)

(3)三维及多维数据插值(interp3)

调用格式:

Vp=interp3(X,Y,Z,V,Xq,Yq,Zq)

Vq=interp3(V,Xq,Yq,Zq)

Vq=interp3(V)

Vq=interp3(V,k)

Vq=interp3(___,method)

Vq=interp3(___,method,extrapval)

函数使用方法同interp2,只是多了参数Z。同样的interpn实现多维数据(一维、二维、三维和n维网格数据)的插值。

%【10 6】在区间【-3 3】创建查询网络,利用二维数据插值函数进行插值
[X,Y]=meshgrid(-3:3); %这里生成的是两个矩阵 生成两个三维矩阵赋给X和Y
V=peaks(7);
subplot(1,2,1);surf(X,Y,V)
title('初始数据');
[Xq,Yq]=meshgrid(-3:0.25:3); %创建间距为0.25的查询网络
Vq=interp2(X,Y,V,Xq,Yq,'cubic');%对查询点插值,并指定三次插值
subplot(1,2,2);surf(Xq,Yq,Vq);
title('cubic插值')

(4)三次样条数据插值

函数:spline

调用格式:

s=spline(x,y,xq)  %返回与xq中的查询点对应的三次样条插值s的向量

pp=spline(x,y)  %返回一个分段多项式结构体,以用于ppval和样条工具unmkpp

函数:pchip(用于计算分段三次Hermite插值多项式),makima(计算修正Akima分段三次Hermite插值多项式),ppval(用于计算分段多项式)。使用方法与spline类似

568%【10 7】将spline、pchip和makima为两个不同数据集生成的插值结果进行比较
x=-3:3; %x的取值范围
y=[-1 -1 -1 0 1 1 1]; %y是行矩阵
xq1=-3:0.01:3; %-3到3 步长为0.01
p=pchip(x,y,xq1);  %计算分段三次插值多项式
s=spline(x,y,xq1);
m=makima(x,y,xq1);    %报错了
plot(x,y,'o',xq1,p,'-.',xq1,m,'--')
legend('Points','pchip','spline','makima','Location','SouthEast')

快速傅里叶变换插值

函数为:interpft 

调用格式:

y=interpft(X,n) %在X中内插函数值的傅里叶变换以生成n个等间距的点

y=interpft(X,n,dim)  %沿维度dim运算

10_2_3曲线拟合和数值积分

 最小二乘法拟合函数polyfit对一组数据进行定阶数的多项式拟合其基本用法为:

p=polyfit(x,y,n)  %返回多项式的系数,是一个长度为n+1的向量p

                        %用最小二乘法对输入的数据x,y,用n阶多项式进行逼近

[p,s]=polyfit(x,y,n)  %额外返回误差分析报告,并保存在结构体变量s中

(在多项式拟合中,如果n=1,相当于用最小二乘法进行直线拟合)

%【10  9】根据某实验中测得的一组数据,在已知x和y呈线性关系的情况下求系数
x=[1 2 3 4 5];
y=[1.2 1.8 2.4 3.9 4.5];
[p,s]=polyfit(x,y,1)
y1=polyval(p,x)
plot(x,y1);hold on;
plot(x,y,'b*');

梯形法数值积分

trapz命令调用格式:

T=trapz(Y)  %用等距梯形法近似计算Y的积分

(Y是向量:trapz(Y)为Y的积分;Y为矩阵:trapz(Y)为Y的每一列的积分;Y为多维阵列,trapz(Y)为沿着Y的第一个非单元集的方向进行计算)

T=trapz(x,y)  %用梯形法计算Y在X点上的积分

(若X为列向量、Y为矩阵,且size(Y,1)=length(X);则trapz(X,Y)通过Y的第一个非单元集方向进行计算)

T=trapz(___,dim)  %沿着dim指定的方向对Y进行积分


%%【10 12】求定积分
X=-1:.1:1;
Y=1./(1+2*X.^2);
T=trapz(X,Y)

%【10 13】求二重积分的
x=-3:.1:3;
y=-5:.1:5;
[X,Y]=meshgrid(x,y);  %创建由域值构成的网格
F=X.^2+Y.^2;   %建立网格上的函数
T=trapz(y,trapz(x,F,2))  %对数值数据的数组执行二重积分运算

计算数值积分

q=quad(fun,a,b)   %近似地从a到b计算函数fun的数值积分,默认误差为1.0e-6

q=quad(fun,a,b,tol)  %用指定的绝对误差tol代替默认误差

q=quad(fun,a,b,tol,trace)  %打开诊断信息的显示

%【10 14】求定积分
% fun=inline('x.^2./(x.^3-x.^2+3)');
% Q1=quad(fun,0,2)
% Q2=quad1(fun,0,2)

%【10 15】分别采用梯形法和自适应辛普森积分法求
m=pi/20;
x=0:m:pi/2;
y=sin(x);
z=trapz(y)*m

z=quad('cos',0,pi/2)

全局自适应积分法

用全局自适应积分法进行数值积分的函数,包括integral(数值积分)、integral2(二重数值积分)、integral3(三重数值积分),调用格式如下:

q=integral(fun,xmin,xmax)  %在xmin~xmax间以数值形式对函数fun求积分

q=integral(fun,xmin,xmax,Name,Value)  %指定一个或多个Name,Value参数对

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

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

q=integral3(fun,xmin,xmax,ymin,ymax,zmin,zmax)

q=integral3(fun,xmin,xmax,ymin,ymax,zmin,zmax,Name,Value)

%【10 16】求函数的广义积分
fun=@(x) exp(-x.^2).*log(x).^2; %创建匿名函数
q=integral(fun,0,Inf) %fun表示被积函数,0和Inf表示被积范围

%【10 17】在笛卡尔坐标系中计算单位球面积分,其中f(x,y,z)=xcosy+x^2cosz
fun=@(x,y,z) x.*cos(y)+x^.2.*cos(z)
xmin=-1;
xmax=1;
ymin=@(x) -sqrt(1-x.^2);
ymax=@(x) sqrt(1-x.^2);
zmin=@(x,y) -sqrt(1-x.^2-y.^2);
zmax=@(x,y) sqrt(1-x.^2-y.^2);
q=integral3(fun,xmin,xmax,ymin,ymax,zmin,zmax)

10.3_常微分方程组的数值求解 

[X,Y]=odeN('odex',[t0,tf],y0,tol,trace)

      其中,odeN可以是上表中任意一个命令;输入参变量odex是f(x,y)的文件名,该函数文件必须以y'=f(x,y)为输出,以x,y为输入参变量,次序不能颠倒。

      变量t0和tf分别是积分的初值和终值;变量y0是初始状态列变量;变量tol控制解的精度,默认值在ode23中为tol=1E-3,在ode45中为tol=1E-6;变量trace决定求解的中间结果是否显示,默认值为trace=0,表示不显示中间结果。

%【10 18】求方程在从x=0到x=30各节点上的数值解
[X,Y]=ode45('odex1',[0,30],[1;-1;0]) %调用ode45命令求解 odex1的定义在下面
plot(X,Y(:,1),'r-',X,Y(:,2),'k:',X,Y(:,3),'b--') %绘图并观察变化趋势
xlabel('timeX');
ylabel('solutionY');
legend('Y1','Y2','Y3');


function dy=odex1(x,y)
dy=[y(2);y(3);y(2)*(1+y(3)^2)-y(1)];
end

【10 19】解微分方程组,其初值条件为
options=odeset('Reltol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]);
[t,Y]=ode45(@rigid,[0 12],[1 0 1],options);%调用ode45命令求解  rigid函数在下面
plot(t,Y(:,1),'-',t,Y(:,2),'-.',t,Y(:,3),'.') %绘图并观察变化趋势


function dy=rigid(t,y)
dy=zeros(3,1);%生成3行1列的零矩阵
dy(1)=-y(2)*y(3);
dy(2)=y(1)*y(3);
dy(3)=2*y(1)*y(2);
end

10.4数据分析和多项式

%【10 21】求随机矩阵的最大值、最小值、平均值。

x=1:20;

y=randn(1,20); %创建20个随机数y

plot(x,y);hold on;

[y_max,I_max]=max(y);

plot(x(I_max),y_max(y),'*');

[y_min,I_min]=min(y);

plot(x(I_min),y_min,'o');

y_mean=mean(y);  %mean是求平均值的

plot(x,y_mean*ones(1,length(x)),'--');

legend('数据','最大值','最小值','平均值')

向量的标准方差有如下两种定义

%%【10 22】比较两个一维随机变量的标准方差与方差
x1=rand(1,200);
x2=8*x1;
std_x1=std(x1);%std()计算标准方差
var_x1=var(x1);%var()计算一组数据的方差
std_x2=std(x2);
var_x2=var(x2);
disp(['x2的标准方差与x1的标准方差之比=' num2str(std_x2/std_x1)]);
disp(['x2的方差与x1的方差之比=' num2str(var_x2/var_x1)]);

%%【10 23】对复数矩阵进行排序
a=[0 -13i 1 i -i -3i 3 -3];
b=sort(a)%进行排序

%%【10 24】求多项式的值和矩阵多项式的值,
p1=[1 3 6]; %多项式x^2+3x+6系数
A=[10 -1];
A1=[1 0;0 1];
p1_A=polyval(p1,A) %求多项式的值
p1_Am=polyvalm(p1,A1)  %求矩阵多项式的值

第十一章 输入和输出

11.1文件的打开与关闭

(permission表示打开文件的形式可以省略)

%%【11 1】打开文件操作示例
fid=fopen('exam.dar','r')  %以只读方式打开二进制文件exam.der
fid=fopen('junk','r+') %打开已存在文件junk.对其进行二进制形式的输入和输出操作
fid=open('junk','w+') %创建新文件junk,对其进行二进制形式的输入和输出操作
                        %如果该文件已经存在,则旧文件内容将被删除

11.2文件的读写

11.2.1 读取二进制文件

fread()可以从文件中读取二进制数据,将每个字节看成一个整数,将结果写入一个矩阵中并返回

调用格式如下

A=fread(fid) %将打开的文件数据读取到列向量A中,并将文件指针定位在文件结尾标记处

A=fread(fid,sizeA) %将文件数据读取到维度为sizeA的数组中(按列顺序填充A)

A=fread(fid,precision) %根据precision描述的格式和大小解释文件中的值

A=fread(fid,sizeA,precision)

A=fread(___,skip) %在读取文件中的每个值之后将跳过skip指定的字节数或位数

A=fread(___,machinefmt)  %另外指定文件中读取字节或位数时的顺序

[A,count]=fread(___)  %还将返回fread读取到A中的字节数

其中,fid是用open打开的一个文件标识;A是包含有数据的数组;count用来读取文件变量的数目;sizeA是要读取文件中数量的数目,有以下3种形式。

inf:读取文件中的所有值。执行完后,array将是一个列向量,包含有从文件中读取的所有值

[n,m]:从文件中精确地读取nxm个值,array是一个nxm的数组。如果fread执行到达文件的结尾,而输入流没有足够的位数写满指定精度的数组元素,fread就会用最后一位数的数值或0填充,直到得到全部的值。

n:准确的读取n个值,执行完后,array将是一个包含有n个值得列向量。

%%【11 2】读/写二进制数据
fid=fopen('dingzx.m','r');
data=fread(fid);
disp(char(data'));%char()将数字、字符串、逻辑值等转换为字符形式的数组

%%【11 3】读取整个文件的uint8数据
fid=fopen('rine.bin','w');
fwrite(fid,[1:6]);%将一个六元素向量写入到示例文件中,
fclose(fid);
fid=fopen('nine.bin');
A=fread(fid) %返回一个列向量,文件中的每个字节对应一个元素
whos A %查看A相关的信息
fcloce(fid);

%%【11 4】写入二进制文件
fid=fopen('dingwrt.bin','w')  %以写形式打开文件
count=fwrite(fid,rand(4),'int32')%在文件中写入信息 rand(4)生成了一个4*4的随机矩阵 
                                 %以int32的形式将4*4的随机矩阵写入fid里打开的文件
status=fclose(fid)  %关闭fid打开的文件 关闭成功则status为0 否则为-1
fid=('dingwrt.bin','r') %以读形式打开一个文件
data=(fread(fid,16,'int32')) %以int32形式读取包含16的fid文件

%【11 5】将一个平方根表写入dingfp.dat文件中
a=4:8 %生成4 5 6 7 8
b=[a;sqrt(a)];%sqrt(a)a中每个元素的平方根
fid=fopen('dingfp.dat','w')
fprintf(fid,'平方根表:\n'); %输出标题 文本
fprint(fid,'%2.00f %5.5f\',b);  %输出变量b的值
fclose(fid);  
type dingfp.dat  %查看文件内容
%【11 6】读取文本文件中的数据
x=100*rand(4,1);  %随机生成4行1列的矩阵
fid=fopen('dingfc.txt','w') %以写的形式打开dingfc.txt文件 如果没有则创建这个文件
fprint(fid,'%4.4f\n',x);  %创建一个包含浮点数的示例文本文件
                          %将x以浮点数形式写入fid里的文件
fclose(fid);
type dingfc.txt   %type显示给定文件内容
fid=fopen('dingfc.txt','r'); %以读形式打开文件dingfc文件
formatSpec='%f'; %formatSpec就是个变量不是函数,'%f'以小数形浮点数输出
A=fscanf(fid,formatSpec)  %打开fid里的文件,并读取到A中,并根据formatSpec指定的类型解释文件中的数据
fclose(fid); %关闭文件

%【11 7】读取文件badpoem。txt(内置文件)的一行内容,并比较两种读取方式
fid=fopen('badpoem.txt');
line_ex=fgetl(fid) %读取第一行,读取时排除换行符
frewind(fid);      %再读取第一行,首先将读取位置指针重置到文件的开头
line_in=fgets(fid) %读取第一行,读取时包含换行符
length(line_ex)
length(line_in)  %line_in的长度

%【11 8】格式化和二进制输入/输出文件的比较
compare %%没懂那个文件是如何保存的,是有资源包的,让你下载呢

11.3_文件位置控制和状态函数及本章总结

%outp.m文件
%目的:打开一个输出文件,检测输出文件是否存在
%定义变量:fid为文件的标识;out_fname为输出文件名;yn表示反馈(Yes/No)
out_fname=input('输入输出文件名:','s'); %得到输出文件 
            %等待用户输入数据,'s':要求客户键盘输入字符型变量x的值
if exist(out_fname,'file') %检查out_fname文件是否存在
    disp('输出文件已存在。') %文件存在
    yn=input('保留现有文件?(y/n)','s') %要求客户键盘输入字符型变量的值
    if yn=='n'
        fid=fopen(out_fname,'wt')
    else
        fid=fopen(out_name,'at');
    end
else
    fid=fopen(out_name,'wt'); %'wt'以写入和文本形式打开文件;
end
fprintf(fid,'%s\n',date); %输出数据
fclose(fid);
%%​【11 9】打开一个输出文件
outp
type outp
a=feof(fid) %检查文件搜索指针是否在文件末尾
ftell position=ftell(fid) %返回文件当前指针
frewind(fid) %将文件位置指针设置在文件开头

%【11 10】获取最近的错误消息
fid=fopen('outages.csv','r') %打开要读取的文件
status=fseek(fid,-5,'bof') %读取位置设置为从文件开始处算起的-5个字节
error=ferror(fid)  %读取文件中最近出现的错误消息的详细信息
fclose(fid)  %关闭文件
%【11 11】打开并读取文件示例
a=rand(1,6);         %随机生成1行6列的向量
fid=fopen('dingrd.bin','w');   %以写形式打开'dingrd.bin'文件
fwrite(fid,a,'short');          %以short形式将a写入fid文件
status=fclose(fid);         %关闭文件 如果status=0则关闭成功 否则status=-1
fid=fopen('dingrd.bin','r');     %以读形式打开dingrd.bin文件
rd=fread(fid,'short');         %以short形式读取fid文件内容
rd'                %进行转置
efo=fefo(fid)    %测试指针是否在文件结束位置
frewind(fid);      %将文件位置指针设置在文件开头
status=fseek(fid,2,0)    %设置指针位置
position=ftell(fid)         %返回fid对应的文件指针读/写的位置

第12章 Simulink仿真

12.1_Simulink模型概述

12.2_Simulink模型创建

信号线:trl键增加分支 

   12.3_子系统的创建封装

%【12 7】触发子系统工作原理:在matlab的命令行窗口运行Simulink模型
[t,x,y]=sim('ex12 7',10);
clf,hold on
plot(t,y(:,2),'r')
stairs(t,y(:,3),'c')
hold off
axis([0 10 -1.1 1.1]),box on
legend({'Chirp Signal','Output','Trigger'},'Location','southeast')
grid on

12.4仿真模型的分析

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值