MATLAB入门笔记

% MATLAB:MATLAB 为 Matrix Laboratory ,用来处理矩阵可编程可实现算法逻辑的计算工具
%
% eg:1 绘制正弦和余弦曲线
x=[0:0.1:4*pi]; %建立角度向量
plot(x,sin(x),x,cos(x)) %画图
axis([0,2*pi,-1,1]) %设定坐标轴范围
title(′正弦和余弦曲线′); %图形名称
xlabel(′θ(弧度)′) %x轴名
ylabel(′y′) %y轴名
legend(′sinθ′,′cosθ′); %图例
grid on; %网格线


% MATLAB指令系统
% Who或whos 显示在当前工作区中的所有变量名,前者显示变量名,后者还显示变量的大小、字节数和类型
% disp(x) 显示x的内容,它可以是矩阵或字符串
% which test 显示 M 文件 test.m 所在的目录
% type test 在命令窗口下显示 test.m 的内容
% cd,chdir,pwd 显示目前的工作目录
% Load 文件名 调出mat文件中的数据。也可以调出文本文件,但是文本文件只能是由数字组成的矩阵形式
% diary
% 建立一个文本文件,记录在MATLAB中输入的所有命令和它们的输出,但是不能包括图形。如果想把你的输入存入一个特定的文件中,可使用 diary
% filename 建立文件。使用diary off↙命令可以停止记录
%
% what 返回目前目录下M,MAT,MEX文件的列表
% echo 控制是否显示M文件执行的每一条命令
% clc 擦除MATLAB工作区中所有显示的内容
% clf 擦除MATLAB图形 工作区中的图形
% hold 控制当前图形窗口对象是否被刷新(在图表中保持现有图形)
% dir,ls 列出指定目录下的文件和子目录清单
% path 显示目前的搜索路径,可以用File菜单中的 Set path 观察和修改路径
% quit 退出工作区可以用,也可选择File菜单中Exit命令
%
% 键盘操作部分
% ↑/Ctrl+p 重调前一行 (用于调出前面的命令进行修改,重新计算)
% ↓/Ctrl+n 重调下一行
% →/Ctrl+b 向前移一个字符
% ←/Ctrl+f 向后移一个字符
% Ctrl+→ 右移一个字
% Ctrl+← 左移一个字
% Home 移动到行首
% End 移动到行尾
% Esc 清除一行
% Del 删除光标后的字符
% Backspace 删除光标前的一个字符
% Ctrl+k 删除到行尾
% help 查看当前帮助系统
% look for 关键字查找,若是要全文搜索,需要加上 -all
% 模糊查询: 输入关键字,然后按tab键,系统会列出这几个关键字开头的命令
%
% 三种基本数据类型:
% 1.数值型数据:输入的数据为数值数据,包括实数和负数
% 2.字符串数据: 用英文格式单引号加以界定的数字,字符,各种符号,表达式,方程式和汉字等
% 3.符号型数据: 用sym或syms把字符、表达式、方程、矩阵等定义成数学符号,运算结果为数学表达式
%
% 变量符号的命名规则基本类似与JAVA,大小写是区分的,长度不能大于63个。
%
% 表达式使用示例:
% x = sin(pi/4) (若省略“=”,系统自动建立一个名为ans的变量)
% x = sin(pi/4); 若以分号结束,则只进行计算不会马上显示结果,但是不写分号,则会马上显示结果
% 一行中若是写几个语句,他们之间要用逗号或分号隔开
% 表达式的变量需要先定义后使用!
%
% 符号变量的声明: syms sym
% syms a1 a2 a3
% a1,a2,a3是需要定义为符号变量的标识符,不能是数字、函数表达式或方程式。
% 变量a1,a2,a3,不能用引号界定,而是用“空格”隔开
%
% x = sym(1/2),y = sym('1/2'), z = sym('sin(x)+exp(x)')
% 显然,sym定义的字符参量可以是数字,字符串,也可以是字符串变量名,字符表达式或字符方程
%
% eg 2: 求极限
% lim [x^(1/m)-a^(1/a)]/x-a , x->a

syms x a;
y = sym('[x^(1/m)-a^(1/a)]/x-a')
limit(y,x,a)

% MATLAB的固定变量:
% ans 用于结果的缺省变量名
% i j 虚数单位,定义为根号-1
% pi 圆周率
% Inf 无穷大,如1/0
% NaN 不确定量 如0/0
% realmin 最小正实数 2.225073858507201×10-308
% realmax 最大正实数 1.797693134862316×10+308
%
% 对变量操作的命令
% who 显示当前工作空间中所有变量的一个简单列表
% whos 列出变量的大小、数据格式等详细信息
% clear 清除指定变量
% save 文件名 变量名 将变量列中所列出的变量保存到磁盘文件中,变量列表中,各个不同的变量之间不能用逗号,只能用空格来分隔
% load 文件名 变量名 将以前用save命令保存的变量从磁盘文件中调入MATLAB工作空间
%
%
% MATLAB主要操作之一:矩阵
% 常用操作矩阵的变量的方法:
% 1.在命令窗口中输入
% 2.语句生成
% 3.函数生成
% 4.小矩阵生成大矩阵
%
% 使用原则:
% 1.矩阵的元素排列在方括号内
% 2.按行输入,每行内的元素使用空格或逗号分隔
% 3.行与行之间用分号,或回车键隔开
% 4.矩阵生成不但可以使用纯数字(含复数),也可以使用变量和表达式
%
% 方括号表达式示例: A = [ 1,2,3;4,5,6;7,8,9]
% 语句生成示例: B = a:h:b 或 B = [a:h:b]
% 其中a为初始值,h为步长,b为终止值。当步长为1时可省略h参数,另外h也可以取负数
% C = linspace(a,b,n) 等价于 C = a:(b-a)/(n-1):b
% 意义是:在线性空间上,行矢量的值从a到b,数据个数为n,缺省则n默认为100.
%
% 常用创建矩阵的函数:
% ones(m,n) 产生m x n的全1矩阵
% zeros(m,n) 产生m x n的全0矩阵
% rand(m,n) 产生m x n的随机矩阵
% eye(m,n) 产生m x n的对角线全1矩阵
% length(X) 返回矩阵最长的维的维度
% size(X) 返回矩阵每一维的长度
%
% 4.小矩阵生成大矩阵示例:
% a = [ 1,2;3 4]
% c = [a a+2 3*a a-2]
% c =
% 1 2 3 4
% 3 4 5 6
% 3 6 -1 0
% 9 12 1 2
%
%
% 矩阵的引用:
% 一.引用矩阵元素
% 1.通过下表引用矩阵元素
% 2.矩阵元素的序号来引用矩阵元素。按列排序,m x n 矩阵A,矩阵元素A(i,j)的序号为(j-1)*m + i (m为列的长度)
% 二.矩阵的拆分
% 1.A(:,j)
% A(:,j)表示取A矩阵的第j列全部元素;
% A(i:i+m,:)表示取A矩阵第i~i+m行的全部元素;
% A(:,k:k+m)表示取A矩阵第k~k+m列的全部元素;
% A(i:i+m,k:k+m)表示取A矩阵第i~i+m行内,并在第k~k+m列中的所有元素
%
%
% MATLAB对数值矩阵的两种不同的运算方法:
% 矩阵算法
% 把矩阵看作一个整体,各种运算完全按照线性代数代表的矩阵运算法则进行,运算的书写形式和运算符号都与矩阵理论完全相同。
% 数组算法
% 把矩阵看作由其元素构成的一组数据(数组),各种运算是在参与运算矩阵的对应元素之间进行的数与数的运算,这种运算方便对大批数据的处理和一次求出多个函数值。
% 数组算法的运算符主要有 .* ./ .\ .^
%
% MATLAB运算符:
% + 加 A+B A B必须大小相同,或一个是标量
% - 减 A-B A B必须大小相同,或一个是标量
% * 矩阵乘 A*B A 的列数等于B的行数
% .* 数组乘 A.*B A B必须大小相同
% \ 矩阵左除 A\B =A-1* B 等效于A*X=B求X A-1=inv(A)
% .\ 数组左除 A.\B Bij/Aij
% / 矩阵右除 A/B =A*B-1 等效于X*B=A求X
% ./ 数组右除 A./B Aij/Bij
% ^ 矩阵乘方 A^m A自乘m次
% .^ 数组乘方 A.^m A中每个元素的m次方
%
% 总结:1.直接使用运算符是矩阵运算,前面带小数点为数组计算。
% 2.矩阵运算的结果是由原本的矩阵得到一个新的矩阵,而数组运算是对原本矩阵的矩阵中的元素做对应的运算
%
%
% 关系运算符:
% ==
% ~=
% >
% <
% >=
% <=
%
% 逻辑运算符:
% &
% |
% !
% 说明:逻辑运算认定任何非零的元素都为真“1”,任何零元素都为假“0”.
%
% 转置:
% A' —— 共轭转置(将矩阵中的每个元素取共轭复数,再转置)
% A.' —— 普通转置(直接对矩阵做转置)
%
% 逆矩阵与行列式计算:
% 求 逆: inv(A)
% 求行列式: det(A)
% 注意:这两种运算都要求矩阵A为方阵!
%
% 矩阵下标说明:MATLAB的矩阵中不同于其他语言,矩阵的下标从1开始,而不是从0开始!
%
% 重点1:四则运算与幂运算
% 1.只有维数相同的矩阵才能进行加减运算
% 2.只有当两个矩阵中前一个矩阵的列数和后一个矩阵的行数相同时,才可以进行乘法运算。
% 3.a\b运算等效于求a*X=b的解,而a/b等效于求x*b=a的解。(这一条可以用来求方程的解)
% 4.只有仿真才可以求幂
% 5.点运算是两个维数相同矩阵对应元素之间的运算。
%
% 特殊矩阵之对角矩阵:V = [a1,a2,a3···,an]
% A = diag(V)
% A = a1 0 0·
% 0 a2 0 0
% 0 0 a3·
% · · ·an
%
% 数值显示格式控制:Format命令
% format(short) : 短格式(5位定点书)99.1253
% format long : 长格式(15位定点书)99.123456789000000
% format short e : 短格式e方式 9.91e+001
% format long e : 长格式e方式 9.912345678900000e+001
% format bank : 2位十进制(小数部分)99.12
% format hex : 十六进制格式
%
% 重点一:求线性方程的解:
% x1 + 4*x2 - 7*x3 + 6*x4 = 0
% 2*x2 + x3 + x4 = -8
% x2 + x3 + 3*x4 = -2
% x1 + x3 - x4 = 1
%
% 实际代码:
A = [1 4 -7 6;0 2 1 1;0 1 1 3;1 0 1 -1]
B = [0;-1;-2;1]
x = A\B

% MATLAB绘图篇:
% help graph2d可以得到所用画二维图形的命令
% help graph3d可以得到所用画三维图形的命令
%
% 一:绘制二维图形
% 格式:
% plot(X,'S')
% plot(X,Y,'S')
% plot(X1,Y1,'S1',X2,Y2,'S2'···,Xn,Yn,'Sn')
% 说明:
% 参数‘S’控制数据点的 标记 曲线类型 和 曲线色彩 , 三者置于一对单引号内。
%
% 常用的绘图选项:
% - 实线 * 用星号标出数据点
% -- 虚线 . 用点号标出数据点
% : 点线 。 用圆圈号标出数据点
% -. 点划线 x 用叉号标出数据点
% b 蓝色 + 用加号标出数据点
% g 绿色 s 用正方形标出数据点
% r 红色 D 用菱形出数据点
% c 青色 V 用下三角标出数据点
% m 洋红 ^ 用上三角标出数据点
% y 黄色 < 用左三角标出数据点
% k 黑色 > 用右三角标出数据点
% w 白色 H 用六角形标出数据点
% P 用五角形标出数据点
%

% 格式一:plot(X,'S')
% 说明:
% 当X是实向量时,以该向量元素的下标为横坐标,元素值为纵坐标画出一条连续曲线。
% 当X是实矩阵时,则按列绘制每列元素值相对其下标的曲线,曲线条数等于输入参数矩阵的列数。
% 示例:
x=0:0.1:2*pi;%length(x)=63
y1=sin(x);
y2=cos(x);
y=[y1',y2'];
z=[y1;y2];
figure(1)
plot(y1 ,'--r+')
figure(2)
plot(y)
figure(3)
plot(z)

% 格式二:plot(X,Y,'S')
% 说明:
% 当X和Y为向量时,长度必须相同,分别用于存储x坐标和y坐标数据。
% 当X是向量,Y是有一维与X同维的矩阵时,则绘制出多根不同颜色的曲线。曲线条数等于Y矩阵的另一维数,X被作为这些曲线共同的横坐标。
% 示例:
x=0:0.1:2*pi;
y=[sin(x);cos(x)];
figure(1)
plot(x,y(1,:))
figure(2)
plot(x,y)

% 格式三:
% plot(X1,Y1,′S1′,X2,Y2,′S2′ ,......,X3,Y3,′S3′)
% 说明:
% 当输入参数都为向量时,X1和Y1,X2和Y2,…,Xn和Yn分别组成一组向量对,
% 每一组向量对的长度可以不同。每一向量对可以绘制出一条曲线,这样可以
% 在同一坐标内绘制出多条曲线。
% 示例:
x=0:0.1:2*pi;
y=[sin(x);cos(x)];
plot(x,y(1,:),′-r′,x(10:60),y(2,10:60),′--ko′)

% 格式四:绘制 y = f(X)图形
% fplot(fname,lims,'S')
% 说明:
% 其中fname为函数名或单引号界定的函数表达式,
% lims为x,y的取值范围,′S′定义与plot函数相同。
% 示例:
fplot('cos(tan(pi*x))',[ 0,1],'-ro')

% 格式五:绘制隐函数图形 f(x,y)= 0
% 方式一:ezplot(f,[xmin,xmax,ymin,ymax])
% 说明:
% 在区间xmin<x<xmax和ymin<y<ymax绘制f(x,y) = 0的图形。,默认区间-2π<x<2π和-2π<y<2π
% 方式二: x=X(t) , y = Y(t)
% ezplot(X,Y,[tmin,tmax])
% 说明:
% 在区间tmin < t < tmax 绘制 x = X(t)和y = Y(t)的图形,默认区间0< t < 2PI
% 方式三: y = f(x)
% ezplot(f,[a,b])
% 说明:
% 在区间a<x<b绘制y= f(x)的图形,默认区间-2π<x<2π
% 示例:
ezplot('x^2+y^2-9',[-3 3 -3 3]),axis equal
ezplot('8*cos(t)','4*sqrt(2)*sin(t)',[0,2*pi])
ezplot('cos(tan(pi*x))',[ 0,1])

% 特殊坐标二位图形
% 1.极坐标曲线
% 格式: polar(theta,rho,'S')
% theta:角度向量,rho:幅值向量,‘S’控制参数
% 示例:
theta=0:0.1:8*pi;
r=cos(4*theta)+1/4;
polar(theta,r)

% 对角坐标曲线 (用法与plot相同)
% 函数名 功能
% semilogx x轴对数坐标,y轴线性坐标
% semilogy x轴对数坐标,y轴线性坐标
% loglog x y轴均为对数坐标
% 示例:
x=0:0.01:5;
y=10.^x;
plot(x,y),grid on

x=0:0.01:5;
y=10 .^x;
semilogy(x,y)
grid on

% 二维图形处理
% 标注方式:
% title(′图形名称′)
% xlabel(′x轴说明′)
% ylabel(′y轴说明′)
% text(x,y,′图形说明′)
% legend(′图例1′,′图例2′,...)
%
% 函数中的说明文字,除使用标准的ASCII字符外,还可使用LaTeX格式的控制字符,这样就可以在图形上添加希腊字母、数学符号及公式等内容。例如,text(0.3,0.5, ′sin({\omega}t+{\beta}) ′)将得到标注效果sin(ωt+β)。
% 上述函数除legend外,均可以用于三维函数。
%
% 示例:
x=[0:0.1:2*pi];
plot(x,sin(x),x,cos(x))
title(′正弦和余弦曲线′);
xlabel(′θ(弧度)′)
ylabel(′y′)
text(3,0.5,′sinθ cosθ 曲线′);
legend(′sinθ′,′cosθ′);
%
% 坐标控制:axis函数
% 主要格式
% axis([xmin xmax ymin ymax zmin zmax])
% axis equal:纵、横坐标轴采用等长刻度。
% axis auto:使用缺省设置。
% axis off:取消坐标轴。
% axis on:显示坐标轴。
%
% grid on/off:控制是否画网格线。
% hold on/off 控制是否刷新当前轴及图形
%
% 示例:
t=0:0.1:2*pi;
plot(sin(t),cos(t))
hold on
plot(t/2/pi,sin(t),'r')
plot(-t/2/pi,sin(t),'r')
grid on;
axis equal
%
% 二.三维图形的基本函数
% 1.三维曲线图
% plot3函数
% 格式:Plot3(x1,y1,z1, ′S1′, x2,y2,z2, ′S2′, …xn,yn,zn, ′Sn′)
% 示例:画画螺旋线
t=-pi:0.1:8*pi;
x=sin(t);
y=cos(t);
plot3(x,y,t,′-r′)
xlabel(′sin(t)′);
ylabel(′cos(t)′);
zlabel(′t′)
%
% 2.三维网格图
% meshgrid函数:产生平面区域内的网格坐标矩阵
% 格式: [X,Y]=meshgrid(A,B)
% 说明:
% 语句执行后,矩阵X的每一行都是向量A,行数等于向量B的元素的个数,矩阵Y的每一列都是向量B,列数等于向量A的元素的个数。
%
% mesh函数
% 格式:mesh(x,y,z)
% 说明:一般情况下,x,y,z是维数相同的矩阵。x,y是网格坐标矩阵,z是网格点上的高度矩阵。
% 示例:三维网格图
[x,y]=meshgrid(0:0.08:2*pi);
z=sin(x).*cos(y);
figure(1)
mesh(x,y,z)
xlabel('x'),ylabel('y')
zlabel('sin(x)cos(x)')
grid on,box on
figure(2)
mesh(z),box on
%
% 3.三维曲面图
% 格式:surf(x,y,z)
% 示例:
[x,y]=meshgrid(0:0.08:2*pi);
z=sin(x).*cos(y);
surf(x,y,z)
zlabel(′sin(x)cos(x)′)
grid on
box on
% 示例:显示夫琅禾费衍射图样
%
w=3e-5;
lamda=6.328e-7;
z=1e5;
A=pi*w^2;
k=2*pi/lamda;
a=linspace(-4000,4000,401);
[x,y]=meshgrid(a);
r=sqrt(x.^2+y.^2);
m=k*w.*r/z;
I=(A/lamda/z)^2 * ( 2*besselj(1,m)./m ).^2;
J=max(max(I));
I=I./J;
figure(1)
surf(x,y,I)
xlabel('x'),ylabel('y'),zlabel('I')
shading(‘interp’)%色彩效果
colormap(jet),colorbar
axis([-4000 4000 -4000 4000 0 1])

figure(2)
plot(x(1,:),I(201,:))
xlabel('x'),ylabel('I')
axis([ -4000 4000 0 1])
%
% 4.图形窗口和分割
% 在实际应用中,有时需要在不同图形窗口或一个图形窗口中绘制若干个独立的图形,
% 这就需要选取不同的图形窗口或对图形窗口分割。
% figure函数
% 格式: figure(n)
% 说明:
% 该函数打开不同的图形窗口。
% n为图形窗口排序号。
% 默认时打开的是1号图形窗,即当前窗。
%
% 示例:
t=linspace(0,2*pi,50);
figure(1)
plot(t,sin(t))
figure(2)
plot(t,cos(t))

% 在实际应用中,有时需要在一个图形窗口中绘制若干个独立的图形,这就需要对图形窗口分割。
% subplot函数
% 格式:subplot(m,n,p)
% 说明:
% 该函数将当前图形窗口分成m×n个绘图区,即每行n个,共m行。
% 区号按行优先编号,且选定第p个区为当前活动区。
% 在每一个绘图区允许以不同的坐标系单独绘制图形。
%
% 示例:
t=0:0.1:2*pi;
subplot(2,2,1)
plot(t,sin(t),’-r’)
title(′x=sin(t)′);
xlabel(′t′)
ylabel(′sin(t)′)
subplot(2,2,2);
plot(t,cos(t),′-b′)
title(′y=cos(t)′);
xlabel(′t′)
ylabel(′cos(t)′)
subplot(2,2,3);
[X,Y]=meshgrid(0:0.1:2*pi);
Z=sin(X).*cos(Y);
surf(X,Y,Z)
zlabel(′sin(t)cos(t)′)
title(′z=sin(t)*cos(t)′);
subplot(2,2,4)
mesh(X,Y,Z)
xlabel(′sin(t)′)
ylabel(′cos(t)′)
zlabel(′sin(t)cos(t)′)
title(′z=sin(t)*cos(t)′);

% 5.简单动画
% (1)质点运动轨迹的显示
% comet函数
% 格式:
% comet(x)
% comet(x,y)
% comet(x,y,p)
% 说明:
% comet(x)显示质点绕向量x运动
% comet(x,y)显示质点绕向量x与y运动
% comet(x,y,p),其中为p轨迹尾巴的长度,缺省值为P=0.1
% 示例:模拟上抛运动
% V(x)=100cos(pi/4)
% V(y)=100sin(pi/4)
% x = V(x)*t
% y = V(y)*t - 1/2*g*t*t
%
vx = 100*cos(1/4*pi);
vy = 100*sin(1/4*pi);
t = 0:0.001:15;
x = vx*t;
y = vy*t-9.8*t.^2/2;
comet(x,y)

% (2)以电影播放的方式显示动画
% 保存想要产生动画的图片,存储为一系列各种类型的二维、三维图,再像放电影的方式按次序播放出来
% 步骤:
% 由getframe函数将当前的图片抓取为电影的画面,存入矩阵中。
% 再由movie函数将矩阵 中的画面以动画显示出来
% 格式: m(j) = getframe
% movie(m)
% 示例:演示驻波
a=50;w=0.2;v=3.64;
for t=1:100
x=0:1:80*pi;
y=a*cos(w*(t-x./v)+pi/2);
z=a*cos(w*(t+x./v));
plot(x,y,x,z,x,y+z);
axis([0 80*pi -100 100]);
grid on;
m(t)=getframe;
end
movie(m)

%
%
% MATLAB的工作模式:
% 1.指令驱动模式
% 通常matlab以指令驱动模式工作,即在matlab 窗口下当用户输入单行指令时,matlab 立即处理这条指令,并显示结果,这就是matlab命令行模式。
% ?命令行模式操作时,matlab窗口只允许一次执行一行上的一个或几个语句
% 在matlab窗口输入数据和命令进行计算时,当处理复杂问题和大量数据时是不方便的。
% 命令行方式程序可读性差,而且不能存储,对于复杂的问题,应编写成能存储的程序文件。
%
% 2.m文件模式
% m文件是matlab所特有的使用该语言编写的磁盘文件。
% 将matlab语句构成的程序存储成以m为扩展名的文件,然后再执行该程序文件,这种工作模式称为程序文件模式。
% 程序文件不能在指令窗口下建立,因为指令窗口只允许一次执行一行上的一个或几个语句。
%
% M文件有两类:
% 1.脚本文件(Script File) : 独立的m文件
% 2.函数文件(Function File): 可调制的m文件
% 脚本文件是一串matlab命令的集合,完成制定的功能,变量空间是workspace;
% 脚本文件既不接受输入参数也不返回输出参数,脚本文件实际上是一串指令的集合,与在命令窗口逐行执行文件中的所有指令,其结果是一样的。
% 函数文件是一个黑箱,根据输入作出输出,变量空间是独立的函数变量空间,在函数运行完成后关闭。
%
% M文件建立:
% 1.命令行输入edit
% 2.新建文件
%
% 1.脚本文件包括两部分:注释部分和程序部分
% a.m
% %绘制sin(x)*cos(x)图形
% x=0:0.1:4*pi;
% y=sin(x).*cos(x);
% plot(x,y)
% %注释部分,用以说明函数的作用及有关内容,使用help命令时显示。只显示程序中的第一句注释语。
%
% 2.函数文件:指能够接受并输出参数的m文件
% 函数文件的格式:
% function 输出形参表=函数名(输入形参表)
% 注释说明语句段
% 程序语句段
% 说明:
% 1.函数m文件第一行必须以单词function作为引导词。
% 2.函数文件的文件命名规则与变量相同,必须是函数名 .m。
% 3.当输出形参多于一个时,须用方括号括起来,以矩阵形式表示。
% 4.程序中的变量均为局部变量,不保存在工作空间中。其变量只在函数运行期间有效。
% 示例:
% peri_area.m
function [l s]=peri_area(r)
%计算圆的周长和面积
l=2*pi*r; %周长
s=pi*r.^2; %面积
[a,b] = per_area(3);
%
% MATLAB的程序结构:(与C语言类似)
% 1.顺序结构
% 2.选择结构
% 3.循环结构
%
% 一.顺序结构
% (1)数据的输入
% input 函数
% 调用格式
% A = input('提示信息'.'选项')
% 说明:选项用于控制输入数据格式,‘s’允许输入字符串。
% 除了字符串输入需要加‘s’,其余的一律不加(如果不加想要输入字符串,则需要‘’包裹输入的字符串)
%
% (2)数据的输出
% disp 函数
% 调用格式
% disp(输出项)
% 说明:
% 输出项可以是变量或字符串。
% 输出变量时,不显示变量名。
%
% sprintf函数
% 调用格式
% S = sprintf(格式,输出项)
% 说明:
% 输出格式控制同c语言
% 输出项可以是变量或表达式
% 示例:输出格式控制
x=pi;m=2;
sprintf('x1=%f x2=%4.3f\nx3=%10.9f', (1+sqrt(5))/2,x,pi)
sprintf(‘%d’,round(x)) %不显示小数点后面的数字
sprintf('%s','hello')
S=sprintf('The array is %dx%d.',m,3) ;
disp(S)

% 重点再次回顾:
%解一元二次方程
%a b c方程系数
%x1 x2为方程的根
disp('pls input a b c')
a=input('a=');
b=input('b=');
c=input('c=');
d=b*b-4*a*c;
x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
disp('x1 x2 is')
disp([x1,x2])
disp(sprintf('x1=%6.5f\nx2=%6.5f',x1,x2))

% (3)程序的暂停
% pause函数
% 调用格式
% pause(延迟秒数)
% 说明:
% 如果省略延迟时间,直接使用pause,则将暂停程序,直到用户按任一键后程序继续执行。
% 若要强行中止程序的运行可使用Ctrl+C命令。
%
% 二。选择结构
% (1)if语句
if 条件1
语句组1
elseif 条件2
语句组2
……
elseif 条件m
语句组m
else
语句组n
end
% (2)switch语句
switch 表达式
case 表达式1
语句组1
case 表达式2
语句组2
……
case 表达式m
语句组m
otherwise
语句组n
end
% try语句
try
语句组1
catch
语句组2
end

% 示例
A=[1,2,3;4,5,6]; B=[7,8,9;10,11,12];
try
C=A*B;
catch
C=A.*B;
end
C
erro=lasterr%显示出错原因

% 三。循环结构
% (1)for语句
% 格式
% for 循环变量=表达式1:表达式2:表达式3
% 循环体语句
% end
% 说明:
% 表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。
% 步长为1时,表达式2可以省略。
% (2)while语句
% while(条件)
% 循环体语句
% end
% 说明:若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环
%
% break和continues语句
% break:用于终止循环的执行。
% continue: 直接进行下一次循环
% 示例:
%计算100~200之间第一个能被21整除的整数
for n=100:200
if rem(n,21)~=0 %rem(x,y) :计算x./y的余数
continue
end
break
end
n

% 一、MATLAB文件的打开和关闭
% (1)文件的打开
% 格式: fid = fopen(文件名,打开方式)
% 说明:
% 其中文件名用字符串形式,表示待打开的文件。
% 常见的打开方式有:
% ′r′表示对打开的文件读数据;
% ′r+′表示读写;
% ′w′删除已经存在的文件内容或建立一个新文件,并打开文件写;
% ′w+′删除已经存在的文件内容或建立一个新文件,读写;
% ′a′表示在打开的文件末尾添加数据。
% fid用于存储文件句柄值,句柄值用来标识该数据文件,其它函数可以利用它对该数据文件进行操作。
%
% (2)文件的关闭
% 格式 sta = fclose(fid)
% 说明:该函数关闭fid所表示的文件。
% sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回–1。
%
% 二、文件的读写操作
% 文件数据格式有两种形式,一是二进制文件,二是文本文件。对不同类型的文件读写是不同的。
%
% (1)二进制文件的读写操作
% 读二进制文件
% 格式 [A,COUNT]=fread(fid,size, precision)
% 说明:
% A用于存放读取的数据。
% COUNT返回所读取的数据元素个数
% fid为文件句柄
% precision代表读写数据的类型:′int′ ′float′ ′char′等
% size为可选项,若不选用则读取整个文件内容,若选用则它的值可以是下列值: (
% 1) N表示读取 N个元素到一个列向量。
% (2) [M,N]表示读数据到M×N的矩阵中,数据按列存放。
%
% 写二进制文件
% 格式: COUNT=fwrite (fid, A, precision)
% 说明:
% COUNT返回所写的数据元素个数。
% fid为文件句柄。
% A用来存放写入文件的数据,
% precision用于控制所写数据的类型,其形式与fread函数相同
%
% (2)文本文件的读写操作
% 读文本文件
% 格式 A = fscanf(fid,format)
% [A,COUNT] = fscanf(fid,format,size)
% 说明:
% A用以存放读取的数据。
% COUNT返回所读取的数据元素个数。fid为文件句柄。
% format用以控制读取的数据格式,由%加上格式符组成,常见的格式符有%d,%f,%e,%c,%s等。
% size为可选项,决定矩阵A中数据的排列形式。
%
% 写文本文件
% 格式: COUNT= fprintf(fid, format, A)
% 说明:
% A存放要写入文件的数据。
% 先按format指定的格式将数据矩阵A格式化,然后写入到fid所指定的文件。格式符与fscanf函数相同。
%
% 示例:文件的操作
clear
x=0:0.1:2*pi;
fid=fopen('example.mat','w+')
count=fwrite(fid,x,'float')
fclose(fid)
fid1=fopen('example.mat','r+')
t=fread(fid1,'float');
y=[t,sin(t)];
plot(t,y(:,2))
fclose(fid1)
%
%
% 二、函数的调用
% 格式
% [输出实参表]=函数名(输入实参表)
% 说明:
% 函数调用时各实参出现的顺序、个数,应与函数定义时形参的顺序、个数一致,否则会出错。
% 函数调用时,先将实参传递给相应的形参,从而实现参数传递,然后再执行函数的功能。
% 示例:利用函数文件,实现直角坐标和极坐标的转换

%定义函数文件tran.m:
function [rho,theta]=tran(x,y)
rho=sqrt(x*x+y*y);
theta=atan(y/x);


%调用tran.m的命令文件exam406.m
x=input('Please input x=:');
y=input('Please input y=:');
[rho,theta]=tran(x,y);
rho
theta

%
% 函数参数的可调性
% nargin和nargout
% 说明:
% 在调用函数时,用nargin和nargout分别记录调用该函数时的输入实参和输出实参的个数。
% 只要在自定义函数文件中包含这两个函数,就可以准确地知道该函数文件被调用时的输入输出参数个数,从而决定函数如何进行处理。
% nargin和nargout用法示例:
%定义函数文件sumproduct.m:
function [out1,out2]=sumproduct(x,y,z)
if nargin==0
disp('no input arguments'),return
elseif nargin==1
sum=x;product=x;
elseif nargin==2
sum=x+y;product=x.*y;
elseif nargin==3
sum=x+y+z;product=x.*y.*z;
else
disp('too many input arguments')
end

if nargout==0
return
elseif nargout==1
out1=sum;
else
out1=sum;out2=product;
end

%调用sumproduct.m
sumproduct
[x,y]=sumproduct(1,2,3)
[x,y]=sumproduct(1)
x=sumproduct(1,2,3)
[x,y]=sumproduct(1,2,3,4)


% 定义全局变量
% globle X
% 说明:
% 说明:
% 全局变量名一般用大写。
% 自定义函数文件中的变量,作用区域仅在函数内部。对于自定义函数中的一些公用变量,可以定义成全局变量,在主程序中统一定义.
% global用法示例:
function y=Ep(x)
%计算弹性势能
global K
y=K*x.^2/2;

function f=F(x)
%计算弹力
global K
f=K*x;

%计算exam408.m
global K
K=0.01;
x=input('Please input x=');
ep=Ep(x)
f=F(x)

% 来自臧小飞老师在最后留下的话:
% 良好的编程习惯:
% 在动手编程之前,明确程序的目的,设想解决方案,作出初步的流程图。如果程序较大,就要把程序分成几个相对独立的模块,各司其职。一个一个模块解决。
% %后面的内容是程序的注解,要养成注释程序的习惯,在关键的命令行,变量定义处必须要有注释,在整个程序开头有一个总结性的注释。这样便于自己或别人查看和修改程序。
% 变量命名规则要统一, 含义清晰。
% 编辑m文件要注意排版,这可以使程序层次变得更清晰,有序,增加程序的可读性。
% 养成在主程序开头用clear指令清除变量的习惯,以消除工作空间中其它变量对程序运行的影响。但注意在函数或子程序中不要用clear。
% 参数值要集中放在程序的开始部分,以便维护。在语句行之后输入分号使其中间结果不在屏幕上显示,以提高执行速度。
% input指令可以用来输入一些临时的数据;而对于大量参数,则通过建立一个存储参数的子程序,在主程序中用子程序的名称来调用。
% 程序尽量模块化,也就是采用主程序调用子程序的方法,将所有子程序合并在一起来执行全部的操作。
% 设置好MATLAB的工作路径,以便程序运行。
%
% 提升MATLAB的运行效率
% 1. 尽量避免使用循环
% a.尽量用向量化的运算来代替循环操作。
% b.在必须使用多重循环时下,则在循环的外环执行循环次数少的,内环执行循环次数多的。这样可以显著提高速度。
% 2.预分配矩阵空间,即事先确定变量的大小、维数。
% 这一类的函数有zeros、ones等。
% 3. 将耗时的循环调用C或fortrun等低级语言运算
% 4.改用更有效的算法
%
% 最后一道题:输出100-200之间第三个被15整除的数
% x=100:200; n=find(rem(x,15)==0); X=x(n(3))
%
%
% 往年期末考试习题:
% 以两种方式求线性方程组的解:
% x1 + 2*x2 - 7*x3 + 6*x4 = 0
% 2*x2 + x3 + x4 = 6
% 4*x2 - 7*x3 + 2*x4 = 7
% 2*x2 - 2*x3 + x4 = 4
% X=A\B
% 在一个图形窗口中绘制直线、圆、极坐标和曲面图四个独立的图形,数据自设,要求图形标注完整。
% 实现上抛和平抛运动的动画演示(速度,时间自设)。
% 输出[100,300]之间第3个能被13整除的整数,另将该 数值范围内所有能被13整除的整数输出。
% Created by Andrew Duan 2016.10.17 00:27:52

posted @ 2016-10-17 13:02  thinfog  阅读(2531)  评论(0编辑  收藏  举报