1.脚本文件 保存文件格式 *.m 文件格式
函数部分 fx 包含绝大部分的函数介绍
注释为 行前加一个 % 如果为连续多行 需要先选中这些行 右键选择注释
两个 %% 将下面的部分分为section 区块
通常用于debug 设置程序的断点 “鼠标点击当前行 序号位置 形成圆点”
debug模式 fx k>> 出现了中间的k字母 表示当前为debug模式 普通模式没有k
2.脚本flow 流程 面向过程的执行过程 从1行 运行到最后一行
结构化程序 子程序 循环 条件 等等
逻辑运算符
&& 和 || 支持逻辑短路功能
实例:
if else
if rem(a, 2) == 0 disp('a is even'); else disp('a is odd'); end
switch case
switch input_num case -1 disp('negative 1'); case 0 disp('zero'); case 1 disp('positive 1'); otherwise disp('other value'); end
while
n = 1; while prod(1:n) < 1e100 n = n + 1; end
for
for n=1:10 a(n)=2^n; end disp(a)
break
x = 2; k = 0; error = inf; error_threshold = 1e-32; while error > error_threshold if k > 100 break end x = x - sin(x)/cos(x); error = abs(x - pi); k = k + 1; end
使用循环语句应尽量预先分配内存空间
若一个变量所需要的内存空间是一个可预测的定值,我们应尽量提前为其分配内存空间.
tic for ii = 1:2000 for jj = 1:2000 A(ii,jj) = ii + jj; end end toc
程序输出Elapsed time is 4.616199 seconds.
tic A = zeros(2000, 2000); % 预先为变量分配内存空间 for ii = 1:size(A,1) for jj = 1:size(A,2) A(ii,jj) = ii + jj; end end toc
Elapsed time is 2.786401 seconds.
可以看到,程序一比程序二所用的时间更长.这是因为: 对于程序一,没有预先为变量A
分配内存,因此每当A
的形状发生改变时,都需要重新为A
分配内存地址,这花费了更多的时间.
tips
clear all 清除所有变量
close all 关闭之前绘制的图像
; 当前语句执行 不显示结果
... 连接本行和下一行的内容 A=[1 2 3 4 5 6;...
6 5 4 3 2 1]; 等价于 A=[1 2 3 4 5 6;6 5 4 3 2 1];
ctrl+c 中断当前执行的程序或语句 跳出
脚本和函数
函数 和普通脚本 都以 .m 文件 形式存在
普通脚本 无输入输出参数 数据为全局作用域
函数 有输入输出参数 数据为局部作用域
查看内建函数的内容 edit(which('mean.m')) mean函数 计算平均值
用户自定义函数
function [输出变量名] = 函数名(输入变量名) % 函数的文档 函数代码
function x=freebody(x0,v0,t)
x=x0+v0.*t+1/2*9.8*t.*t; 点乘 对应元素相乘 为什么不用*呢 因为当参数t为标量和向量或矩阵的情况都可使用。
保存为 freebody.m 文件形式的函数
调用方式
案例1
cos(10) 输出1个值
cos([1 2 3 4 5]) 输出5个数值
案例2
freebody(1,2,5) x0=1 v0=2 t=5
freebody([0 1],[0 1],[10 20]) 输入两组数据 分别是 x0=0 v0=0 t=10 第2组输入为x0=1 v0=1 t=20
所以输出为两组 分别为490 1981
实例:
freebody(0, 0, 2) % 得到 19.6000 freebody(0, 0, [0 1 2 3]) % 得到 [0 4.9000 19.6000 44.1000] freebody(0, 0, [0 1; 2 3]) % 得到 [0 4.9000; 19.6000 44.1000]
inputname
MATLAB不提供其他高级语言的指定默认参数值以及函数重载等语法,但灵活使用上述内置的函数参数,可以在一定程度上实现指定默认参数值以及方法重载:
function [volume]=pillar(Do,Di,height) if nargin==2, height=1; end volume=abs(Do.^2-Di.^2).*height*pi/4;
多输入 多输出的函数
实例:下面函数实现了从华氏温度到摄氏温度的转换,该函数可以识别输入的待转换样例的个数,当输入的待转换样例个数为0时,退出函数.
function F2C() while 1 F_degree = input('tempreature in Fahrenheit: ', 's'); F_degree = str2num(F_degree); if isempty(F_degree) return end C_degree = (F_degree-32)*5/9; disp(['tempreature in Celsius: ' num2str(C_degree)]) end
以函数句柄形式定义函数
我们也可以使用函数句柄的形式定义函数,这更接近数学上的函数定义,其语法如下:
函数句柄 = @(输入变量) 输出变量 % 直接通过函数句柄调用该方法 f = @(x) exp(-2*x); x = 0:0.1:2; plot(x, f(x));