视频教程:b站视频【MATLAB教程_台大郭彦甫(14课)原视频补档】https://www.bilibili.com/video/BV1GJ41137UH/?share_source=copy_web&vd_sourc*e=d6b9f96888e9c85118cb40c164875dfc
官网教程:
- MATLAB 快速入门 - MathWorks 中国
参考博客:
- MATLAB(二)结构化程式与自定义函数
- 【台大郭彦甫】Matlab入门教程超详细学习笔记三:结构化程式与自定义函数(附PPT链接)
声明:自己跟着敲了一遍,仅供个人参考学习。
软件版本:MATLAB R2016b
脚本编辑器
新建脚本-运行
新建一个脚本文件(我的命名M02_01.m
),文件保存命名不能以数字开头,用字母开头,字母大小写有区别
我习惯路径都为英文,关键字命名后面可以加条下划线,如for_.m
for i=1:10
x=linspace(0,10,101);
plot(x,sin(x+i));
print(gcf,'-deps',strcat('plot',num2str(i),'.ps'));
end
遇坑:按运行出现弹框
我搜了一下,大概原因是:
:::tips
如果我们新建一个.m文件,习惯性保存在默认文件夹,但是没有先重新从进入默认文件夹,再打开我们新建的文件,那么MATLAB就还没有反应过来我们已经将新建的文件保存到了默认文件夹,从而误认为文件不在默认文件夹下,进而在我们运行文件时还是会报错,因为MATLAB没反应过来。
参考博客MATLAB“在当前文件夹或MATLAB路径中未找到文件“的小“坑”
:::
做法:先打开浏览文件夹,再从左侧的结构树上找到该.m文件(该文件夹下的),并打开它,再运行就不报错。
常用功能
- 注释
ctrl+R
- 取消注释
ctrl+T
- 注释换行
ctrl+J
- 智能缩进
ctrl+I
语法
关系逻辑(操作)符
条件语句
if-elseif-else 语句
if-else
% Generate a random number
a = randi(100, 1);
% If it is even, divide by 2
if rem(a, 2) == 0
disp('a is enen')
b = a/2;
disp(b)
else
disp('a is old')
b = a/2;
disp(b)
end
if-elseif-else
多个条件
% Generate a random number
a = randi(100, 1);
disp(a)
if a < 30
disp('small')
elseif a < 80 % 30 <= a <80
disp('medium')
else
disp('large')
end
switch语句
% input_num=1;%可以修改
input_num=0;
% 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
循环语句
for循环语句
for n=1:10
a(n)=2^n;
end
disp(a)
while循环语句
1e100=1x10^100
prod(1:n)=n!
n = 1;
while prod(1:n) <1e100 % prod(1:n)=n!
n = n+1;
end
disp(n) % 得到的结果n-1是小于1e100的最大的阶乘数
练习
- 使用while循环来计算序列的总和1+2+3+…+999
% 初始化
n = 1;
sum = 0;
% while循环
while n < 1000
% disp(n) %打印循环次数
sum = n+sum;
n = n+1;
% disp(sum)%打印每次循环得到的结果
end
disp(sum) %打印结果
- 用for循环做一遍上题。
% 初始化
n = 1;
sum = 0;
% for循环
for n = 1:999
sum = n + sum;
n = n+1;
end
disp(sum) %打印结果
结果同上。
预分配
参考官网https://ww2.mathworks.cn/help/matlab/matlab_prog/preallocating-arrays.html
- 如果未预分配空间,matlab每次经过 for 和 while 循环时,会在每次迭代时调整其大小,会比较费时间
- 若一个变量所需要的内存空间是一个可预测的定值,我们应尽量提前为其分配内存空间。
对要初始化的数组类型使用适当的预分配函数:
- 对于数值数组,使用
zeros
- 对于字符串数组,使用
strings
- 对于元胞数组,使用
cell
- 对于表数组,使用
table
示例
tic-toc
可以用于计时。
运行效果:
tic
x = 0;
for k = 2:100000
x(k) = x(k-1) +5;
end
toc
%%
tic
x = zeros(1,1000000);
for k = 2:100000
x(k) = x(k-1) +5;
end
toc
练习
分析:
- 首先找到矩阵A中的所有负数;
- 把它们存在矩阵B中;
- 把这些负数变为0.
结果图:
方法1
注:体会一下第9、10行不加分号与加分号打印的结果。
其实发现不加分号打印的是循环的结果,加了分号用disp()
打印的是最终结果。
%方法1
%% 1、不加分号
A = [0 -1 4; 9 -14 25; -34 49 64]
B=zeros(size(A)); % size(A)同时求矩阵的行和列数
for i = 1:size(A,1) % size(A,1)求矩阵的行数
for j = 1:size(A,2) % size(A,2)求矩阵的列数
if(A(i,j))<0
B(i,j)=1 % 把负数放到矩阵B,负数变为1
A(i,j)=0 % 把矩阵A中的1全部置零
end
end
end
%% 2、加分号
A = [0 -1 4; 9 -14 25; -34 49 64]
B=zeros(size(A)); % size(A)同时求矩阵的行和列数
for i = 1:size(A,1) % size(A,1)求矩阵的行数
for j = 1:size(A,2) % size(A,2)求矩阵的列数
if(A(i,j))<0
B(i,j)=1; % 把负数放到矩阵B,负数变为1
A(i,j)=0; % 把矩阵A中的1全部置零
end
end
end
disp(B) % 打印矩阵B
disp(A) % 打印最后的矩阵A
打印结果:
- 不加分号
>> exe1
A =
0 -1 4
9 -14 25
-34 49 64
B =
0 1 0
0 0 0
0 0 0
A =
0 0 4
9 -14 25
-34 49 64
B =
0 1 0
0 1 0
0 0 0
A =
0 0 4
9 0 25
-34 49 64
B =
0 1 0
0 1 0
1 0 0
A =
0 0 4
9 0 25
0 49 64
- 加分号
>> exe1
A =
0 -1 4
9 -14 25
-34 49 64
0 1 0
0 1 0
1 0 0
0 0 4
9 0 25
0 49 64
方法2
%方法2
A = [0 -1 4; 9 -14 25; -34 49 64]
B = A < 0 % 返回一个零一矩阵,数组A中小于0的位置为1
A(B) = 0 % A(B) = X(未知) X : 与 B 大小一样(行数和列数相等)
打印结果:
>> exe2
A =
0 -1 4
9 -14 25
-34 49 64
B =
3×3 logical 数组
0 1 0
0 1 0
1 0 0
A =
0 0 4
9 0 25
0 49 64
break
break作用:终止执行 for 或 while 循环。
参考官网https://ww2.mathworks.cn/help/matlab/ref/break.html?searchHighlight=break&s_tid=srchtitle_support_results_1_break
limit = 0.8;
s = 0;
while 1
tmp = rand; %随机数
if tmp > limit
break
end
s = s + tmp;
end
disp(s)
技巧
clear all
清除工作区内存中的变量close all
关闭之前程序绘制的图像clc
清空之前程序在终端的输出- 在命令末尾使用分号
;
来抑制输出(就是终端不能直接打印结果) - 省略号
…
可以将多行语句拼接为一行,灵活使用该语句可以提高代码可读性
%%
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
提前结束运行
自定义函数
查看内置函数
在命令行窗口输入edit(which('mean.m'))
可以调出内置函数mean.m
,如下图所示:
参考官网https://ww2.mathworks.cn/help/matlab/ref/function.html
说明:
- 关键字:
function … end
结尾 - 函数保存的.m文件,函数名必须和文件名一致;
- 也可将临时使用的函数定义在脚本文件内,但需要定义在文件最后;
- 输入 input();输出可以用 disp() 或者 fprintf()
- 注意 matlab 中对于字符串均使用 ‘’ 而不是 “” ,fprintf() 中的内容使用 ''括起来。
function的编写
例1:自由落体
写一个函数,计算给定初始位移xo,初始速度vo,下落时间t的自由落体位移:
例2:具有多个输入和输出的函数
function [a F] = acc(v2,v1,t2,t1,m)
a = (v2-v1)./(t2-t1);
F = m.*a;
例3:从华氏温度转换到摄氏温度
华氏温度用F,摄氏温度用C。转换公式为:
%从华氏温度(F)转换到摄氏温度(C)
function F2C()
while 1
F = input('请输入华氏温度:','s');
F = str2num(F);
if isempty(F)
return
end
C = (F-32)*5/9;
disp(['摄氏温度为:',num2str(C)])
end
内置的函数参数
使用函数句柄形式定义函数
参考官网https://ww2.mathworks.cn/help/matlab/ref/function_handle.html
使用 @ 运算符创建一个函数句柄。
要求该匿名函数从 0 到 1 的积分,请将其句柄传递给 integral。
f = @(x) x.^3 + x.^2 + x + 1;
q = integral(f,0,1) %该匿名函数从 0 到 1 的积分
-END-