【台大郭彦甫】Matlab入门教程超详细学习笔记三:结构化程式与自定义函数(附PPT链接)


前言

【台大郭彦甫】PPT链接:https://pan.baidu.com/s/1VXdy3HCBPexMK0csyehiZA 提取码:2io1
matlab官方帮助文档:https://ww2.mathworks.cn/help/


一、脚本编写(.m文件)

首先点击左上角新建脚本按钮,将代码复制进窗口,点击F5或者Run保存文件

for i=1:10
    x=linspace(0,10,101);
    plot(x,sin(x+i));
    print(gcf,'-deps',strcat('plot',num2str(i),'.ps'));
end
  1. 文件命名:不可以数字开头;大小写有区别
  2. 注释:全选右键
  3. “%%”将整个脚本文件分为若干“节”,可以选择“运行当前节”来执行某部分代码,方便debug
% % 
for i=1:10
    x=linspace(0,10,101);
    plot(x,sin(x+i));
    print(gcf,'-deps',strcat('plot',num2str(i),'.ps'));
end
% % 
for i=1:10
    x=linspace(0,10,101);
    plot(x,sin(x+i));
    print(gcf,'-deps',strcat('plot',num2str(i),'.ps'));
end
  1. 也可以添加断点debug,此时鼠标悬停于变量上可以查看该变量详细信息,可点击继续,运行后半部分代码
    在这里插入图片描述
  2. 如图,右键智能缩进
    在这里插入图片描述

二、结构化程序设计

1.逻辑运算符

逻辑运算符

注意:matlab中的不等于:~=
其他与c一致:
在这里插入图片描述

2.控制语句

  1. if-elseif-else
    条件为 true 时执行语句
if expression
    statements
elseif expression
    statements
else
    statements
end

eg.rem(x,y):求整除x/y的余数

a=3;
if rem(a, 2) == 0
    disp('a is even')
else
    disp('a is odd')
end
  1. swith
    执行多组语句中的一组
switch switch_expression
   case case_expression
      statements
   case case_expression
      statements
    ...
   otherwise
      statements
end

eg.

input_num = 1;
switch input_num
    case -1
        disp('negative 1');
    case 0
        disp('zero');
    case 1
        disp('positive 1');
    otherwise
        disp('other value');
end
  1. while
    条件为 true 时重复执行的 while 循环
while expression
    statements
end

eg.prod()函数用于求数组元素的乘积;
prod(1,n)表示n!;1e100 = 1×10的100次方

n = 1;
while prod(1:n) < 1e100
    n = n + 1;
end

运行之后不显示结果,在命令行窗口输入n,得到70

练习
在这里插入图片描述

sum=0;
i = 1;
while i < 1000
    sum=sum+i
    i = i + 1; 
end
fprintf('和为:%d\n',sum);
  1. for
    用来重复指定次数的 for 循环
for index = values    % values为start:increment:end
   statements
end

eg.

for n=1:10
    a(n)=2^n;
end
disp(a)

运行后修改为下面代码,发现结果相同,是因为此时a已经在内存中,需要clear a之后再计算

for n=1:2:10
    a(n)=2^n;
end
disp(a)
  1. break
    终止执行 for 或 while 循环
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

3.为变量预分配空间

  • 如果未预分配空间,matlab会在每次迭代时调整其大小,会比较费时间
  • 若一个变量所需要的内存空间是一个可预测的定值,我们应尽量提前为其分配内存空间。

使用范例:

  • tic-toc可以用于计时。
tic
for ii = 1:2000
    for jj= 1:2000
        A(ii,jj) = ii + jj;
    end
end
toc
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

练习
在这里插入图片描述
方法1:

A = [0  -1  4
     9 -14 25
    -34 49 64]
B = zeros(size(A));
for i = 1:size(A,1)
    for j = 1:size(A,2)
        if(A(i,j)<0)
            B(i,j)=1;
            A(i,j)=0;
        end
    end
end
  • size(A,1)求矩阵的行数
  • size(A,2)求矩阵的列数,相当于length(a)
  • size(A)同时求矩阵的行和列数

方法2:

A = [0  -1  4
     9 -14 25
    -34 49 64]
B = A < 0
A(B) = 0
  • B = A < 0
    返回一个零一矩阵,数组A中小于0的位置为1
  • A(B) = X(未知)
    X : 与 B 大小一样(行数和列数相等)

4.编写脚本时应注意的问题

  1. clear all 清除工作区内存中的变量
    close all 关闭之前程序绘制的图像
    clc 清空之前程序在终端的输出

  2. 在所有运算和赋值语句都应该添加分号; 抑制输出,若需要向终端输出一个变量,应对其调用disp方法.

  3. 在matlab中,省略号…可以将多行语句拼接为一行,灵活使用该语句可以提高代码可读性.

 A = [1 2 3 4 5 6; ...
        6 5 4 3 2 1];
  1. 按Ctrl+C提前结束运行

三、自定义函数

与脚本类似,自定义函数可以被存入函数名.m文件中,也可以以函数句柄的形式定义在内存中。

1.查看内置函数

  1. 我们可以使用which命令查看内置函数源代码文件的位置,与edit命令结合可以查看内置函数的源代码.

  2. 运行下面语句可以打开matlab内置的mean函数的源文件:

edit(which('mean.m'))
  1. 可以在编辑器中看到:
    在这里插入图片描述

2.function的编写

function

  • 关键字: function … end 结尾
  • 函数保存的.m文件,函数名必须和文件名一致;
  • 也可将临时使用的函数定义在脚本文件内,但需要定义在文件最后;
  • 输入 input();输出可以用 disp() 或者 fprintf()
    注意 matlab 中对于字符串均使用 ‘’ 而不是 “” ,fprintf() 中的内容使用 ''括起来;

eg.

  1. 自由落体运动中位移量:在这里插入图片描述
    将下列代码保存至freebody.m文件中,在命令行窗口可使用
function x = freebody(x0,v0,t)
% calculation of free falling
% x0: initial displacement in m
% v0: initial velocity in m/sec
% t: the elapsed time in sec
% x: the depth of falling in m
x = x0 + v0.*t + 1/2*9.8*t.*t;
>> freebody(0,0,10)
ans =
   490

MATLAB编程技巧 :计算乘法时应尽量使用.*而非*,因为前者不仅对参数t为标量的情况可用,也对变量t为向量或矩阵的情况可用.
如下:

>> freebody([0,1],[0,1],[10,10])
ans =
   490   501
  1. 定义多参数或多返回值(多输入输出)的函数:
    在这里插入图片描述
    将下列代码保存至acc.m文件中,在命令行窗口可使用
function[a, F] = acc(v2,v1,t2,t1,m)
a = (v2-v1)./(t2-t1);
F = m.*a;
>> [Acc Force]=acc(20,10,5,4,1)
Acc =
    10
Force =
    10

练习

从华氏温度转换到摄氏温度:
在这里插入图片描述

function F2C()
while 1
    F = input('请输入华氏温度:','s');
    F = str2num(F);
    if isempty(F)
        return
    end
    C = (F-32)*5/9;
    disp(['摄氏温度为:',num2str(C)])
end
>> F2C
请输入华氏温度:12
摄氏温度为:-11.1111
请输入华氏温度:11 22 33
摄氏温度为:-11.6667     -5.55556     0.555556

最后使用ctrl+c终止程序

3.内置的函数参数

在这里插入图片描述

4.使用函数句柄形式定义函数

function_handle是一种创建匿名函数的方法,即不必在 .m 文件中定义的单行表达式函数

f = @(x) exp(-2*x);
x = 0:0.1:2;
plot(x, f(x));
  • function handles 其实是一个指针,它使 f 指向函数 exp(-2*x)f 的输入在 @(x) 处,此处的 x 则将成为函数 exp 的输入参数。

总结

以上就是第二节的内容,本部分介绍了matlab的结构化程式与自定义函数。

  • 11
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哆啦lalala

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值