MATLAB大纲

  • 基础语法
    • 基本类型
      • 基本类型和运算
      • 字符串
      • 时间和日期
    • 高级类型
      • 单元数组
      • 结构数组
      • 表、时间表
      • 其他:稀疏矩阵、字典、分类数组
    • 程序结构
      • 分支
      • 循环
      • 函数
    • 文件读写
    • 错误和调试
  • 矩阵运算张量运算:多维数组
    • 数组操作
    • 数组运算

MATLAB简介

  • 解释型
  • 数值计算

快捷键

  • 命令窗口:CTRL+0
  • 工作文件夹浏览器:CTRL+2
  • 变量空间:CTRL+3
  • 代码编辑器:CTRL+SHIFT+0

用法

  • 注释:%
  • 续行:...
  • 句末消显示:;/不消:,

简单命令

  • clc; clear

  • who; whos

  • ver; version

  • 系统命令!(替代cmd)

  • 全部注释/取消注释:CTRL+R/T

  • 历史命令


基本类型

x = int16(2.5)
y = 2.5
z = 1+2j
abs(z)
l = true

x =
int16
3
y =
2.5000
z =
1.0000 + 2.0000i
ans =
2.2361
l =
logical
1
  • int16/32(2.5)四舍五入

  • 复数:i/j

  • true~1; false~0

  • 判断是否是NaNisnan(NaN)

运算

运算顺序

  1. 括号()
  2. 转置'和乘幂^
  3. 正负号+-和逻辑非~
  4. 乘除*/\和加点的版本.*./.\
  5. 加减法+-
  6. 序列生成器
  7. 关系运算<>=<===~=
  8. 逻辑与&
  9. 逻辑或|
  10. 短路逻辑与&&
  11. 短路逻辑或||

运算

  • 对数需要换底公式

数值显示格式


字符串

  • UTF-16
  • 字符串=字符数组
  • 字符串数组=单元数组Cell{}
a='Hello'
a(1:2)
upper(a)
lower(a)
char(double('A')+32)

字符串操作

  • 大小写upper()/lower()

  • 空白符

    • 换行符newline()

    • 生成一段空白符blanks(n)

    • 添加在末尾/某侧pad(str,n[,side='left','right','both'])

    • 删除末尾/开头和末尾/某侧

      deblank(str)/strtrim(str)/strip(str,side,stripchar)

    • 右/左对齐strjust(str,side)

  • 判断isstrprop(str,category='alpha'...)

  • 反转reverse

  • 比较numel(s1)==numel(s2)&&all(s1==s2)(短路运算符):

    strncmp(s1,s2[,n])

  • 查找/替换strfind(str,pattern)/strrep(str,old,new)

  • 分割/合并strsplit(str,deli)/strjoin(Cell)
    分割单词:

    while ~isempty(remain)
    [token ,remain] = strtok(remain);
    disp(token);
    end

字符串转换

  • 读取(字符串→数字/角度)

    str2double('3.1416')/str2num('1+0.2*sin(30)')/str2angle(str)

  • 写入(数字→字符串)num2str(pi)

字符串格式化

num2str(A,formatSpec)
num2str(555,'%03d')
%[标志][宽度].[精度][子类型][转换字符]
%[标志/-,+,0,#(补0)][宽度/4]
.[精度/2][子类型/(u,o,x)]
[转换字符/(d十进制整数,u,o,x),f浮点,e科学计数法,g有效数字]
  • 使用#补0:保留4位有效数字=
    num2str(12.598,'%[#].4g')
  • sprintf
%[标识符/索引][标志][宽度].[精度][子类型][转换字符]
sprintf('%3$02d %2$02d %1$02d %2$02d',1,2,3)

日期和时间

读取时间

  • datetime格式的时间datetime([2022,5,6,10,25,33])
d = '2018-06-25 11:23:37.712';
t = datetime(d,'InputFormat','yyyy-MM-dd HH:mm:ss.SSS')

得到tdatetime格式时间:

t = datetime
25-Jun-2018 11:23:37
  • 改变t蕴含的格式:t.Format = 'MMM dd, yyyy HH:mm:ss.SSS'
    t = datetime
    Jun 25, 2018 11:23:37.712

程序结构

  • 条件表达式总是短路

分支/选择结构

if语句

if 条件表达式
语句块
elseif 条件表达式
语句块
else
语句块
end
  • 变量在语句块之外预先定义

switch语句

switch 条件表达式(变量)
case 情况表达式(变量的值)
语句块
case 情况表达式
语句块
otherwise
语句块
end
  • 多种情况,需要使用Cell单元数组
  • otherwise:封闭的(能表示所有情况)

循环结构

  • break
  • continue

for语句

  • 计次循环
  • 循环的次数等于循环数组的列数,每次使循环变量等于循环数组的一列(一般行向量:循环n次,循环变量遍历全数组)
  • 不能像其他语言那样用循环变量的取值判断当前是第几次循环,只能自行计数
  • 循环变量的赋值不是发生在循环执行的语句块内部,而是在每次执行之前;在下次执行之前被覆盖
for 循环变量 = 循环数组
语句块
end
for i = 1:4
disp(i)
end

while语句

  • 条件循环
while 条件表达式
语句块
end
clc;clear;
cnt = 1;
suffix = ["st", "nd", "rd", "th"];
cmd = 'y';
while cmd == 'y'
cmd = inputdlg("This is the "+cnt+suffix(min(cnt ,4))+" greeting. Continue [Y/n]?");
if isempty(cmd) % 点击了“取 消”按钮
cmd = 'n';
else % 按了回车或点击了“确定”按钮
cmd = cmd{1}; % 返回的是单元数组
if isempty(cmd)
cmd = 'y';
else
cmd = lower(cmd(1));
end
end
while cmd ~= 'y' && cmd ~= 'n'
cmd = inputdlg('Please answer yes or no [y/n]: ');
if isempty(cmd)
cmd = 'x';
else
cmd = cmd{1};
if isempty(cmd)
cmd = 'x';
else
cmd = lower(cmd(1));
end
end
end
cnt = cnt+1;
end

函数

  • 必须保证函数的输出参数在任何程序分支中都被赋值

  • 函数返回值唯一支持的寻访操作是结构体的取值,不支持用圆括号或花括号进行数组的寻访

  • 命令-函数二元性(每个输入形参都当成字符向量即单引号字符串

    load data.mat
    load('data.mat')

  • 避免定义与常用函数或命令同名的变量(二义性)

一般语法

function [输出参数] = 函数名(输入参数)
语句块
end

特殊关键字/语句/命令

  • 控制:

    • return语句:退出/返回
  • 作用域:

    • persistent持久变量;函数执行完毕销毁变量空间时保留持久变量不予销毁

    • golbal全局变量:该变量在全局空间中查找

参数

参数形式

  • nargin函数:获取本次调用实际接受的参数个数

  • arguments语句:位于函数头部,定义默认值;提供了默认值的参数是可选参数,没有提供默认值的参数是必需参数

    arguments
    x = 1
    end

  • 可重复参数arguments (Repeating)(提供任意多遍)

    • 可重复参数必须出现在位置参数之后
    • 所提供的实参首先按顺序逐个分配给位置参数;如果实参有剩余,再分配给可重复参数
  • 名称参数func(name1=value1,...)

    • 不区分大小写
    • 支持部分匹配

    function func(args)
    arguments
    args.name1
    end
    end

  • 可变长度参数列表:varargin

    • 接受任意多个实参,并将它们收集成一个单元数组
    • 实际提供的实参个数可通过numel(varargin)求得,也可使用nargin函数
    • varargin可以与位置参数搭配使用,但必须出现在它们后面,作为参数列表的最后一个参数

    function f(varargin)

  • 参数解析器inputParser

参数验证

  • 形状验证
  • 类型验证
  • 验证函数mustBe(可以自行编写):mustBeIntegermustBeNonnegativemustBeInRangemustBeNonemptymustBeMember
    • mustBeA:验证参数是否属于给定的类型
    • mustBeFilemustBeFolder:判断字符串是否为有效的文件名或文件夹名,而且文件或文件夹必须存在
    • mustBeTextScalar:判断是否为字符串标量,包括单引号和双引号字符串
    • mustBeText:判断是否为字符串数组(含标量),包括放在单元数组中的多个单引号字符串、竖向串联的多个单引号字符串(即字符数组)、双引号字符串的数组
    • mustBeNozeroLengthText:判断字符串是否为空,可以应用于字符数组的每个元素
    • mustBeVariableName:判断字符串是否是有效的变量名,但变量不一定要存在
  • 参数解析器

匿名函数

@(输入参数列表)表达式
f = @(x)x+1
  • 匿名函数创建时会将用到的外部变量封存进自己的变量空间

  • 查找顺序:变量空间–子函数(嵌套函数–局部函数–私有函数)–工作文件夹–搜索路径