MATLAB基础语法
2026年05月27日
程设计科 / 编程语言
53443字符
阅读量:Loading

NOTE

下面的内容主要来自于上课 PPT + AI 生成

Lec 1:MATLAB 入门、数组、数值精度

1. 课程基本信息

1.1 课程名称

Introduction to Scientific Computing 科学计算导论

本课程围绕 MATLAB 展开,学习科学计算中常用的编程、矩阵运算、可视化、数值方法和工程应用。

2. Course outline & schedule 课程安排

周次内容
Week 1Lec 1:Course Introduction, Machine Model, Intro to MATLAB, Built-in functions, Arrays, Linear algebra, Interfacing with MATLAB, Numerical accuracy
Week 2Lec 2:Functions, Arrays, Operations on Arrays, Loops, If-else-end
Week 3Lec 3:Arrays, Array Operations, Logical array, Matrix, Matrix operations
Week 4Lec 4:File Input/Output, 2D & 3D Plotting
Week 5Lec 5:Differentiation & Integration, Dynamical and Stochastic Systems, ODE & Random Numbers
Week 6Lec 6:Polynomials, Curve Fitting & Interpolation, Probability and Statistics, Root Finding & Optimization
Week 7Lec 7:Combinatorial Optimizations, Shortest Path Problems & Sorting, Matrix Computation, Over-constrained Systems, Least Squares Method
Week 8Lec 8:Image Processing, Symbolic Math, GUI
Week 9Final project show & tell,Final project report due

3. 参考资料

3.1 Textbook 教材

Essential MATLAB for Engineers and Scientists 作者:Hahn & Valentine

3.2 其他资料

  • LLM:GPT、Gemini、DeepSeek 等
  • MATLAB Help:MATLAB help 可能是最好的教材
  • Course website:https://course.zju.edu.cn/

4. 课程内容简介

4.1 What is this course about?

本课程涉及三个方面:

  1. About computer programming

编程语言就是给计算机的指令。

MATLAB 是:

  • 一种高级编程语言
  • 一个专门用于工程和科学计算的计算系统
  • 特别适合:
    • 数值计算
    • 数据分析
    • 可视化
  1. About scientific computing

科学计算关注:

  • 解决科学问题的基本技术
  • 解决科学问题的策略
  • 应用领域:
    • 科学
    • 工程
    • 经济学
    • 其他很多学科
  1. About programming methodology

编程方法论包括:

  • 程序设计
  • 编程风格
  • 调试 debugging
  • 算法和数据结构
  • 抽象的计算机科学 / 编程概念

5. Course topics 课程主题

本课程会涉及:

  • MATLAB 基础编程
  • MATLAB 中的矩阵 / 数组操作
  • 可视化 visualization
  • 线性系统 linear systems
  • 调试代码 debugging
  • 模拟动态系统 simulating dynamic systems
  • 优化问题 optimization
  • 组合问题 combinatoric problems
  • 随机化 randomization
  • 数据分析 data analysis
  • 信号处理 signal processing
  • 控制 control

6. Course mechanics 课程机制

6.1 上课时间

  • Lectures:8 周,每周 3 小时
  • Tuesday:13:25 – 15:50
  • Room:西 2-310

6.2 成绩组成

项目占比
6 次作业50%
1 次期中考试20%
Final project30%

Final project 要展示你的 MATLAB 能力。

6.3 作业提交

  • 提交时间:Wednesday 1:00 pm,课前
  • 迟交政策:
    • 迟交 48 小时内:扣 25%
    • 迟交 72 小时内:扣 50%
    • 超过 72 小时:不接受

6.4 Plagiarism policy 抄袭政策

  • 作业 / 项目可个人完成或 pair programming。
  • 如果发现作业整体或部分复制,所有相关人员该次作业为 0。
  • 第二次违规:
    • 课程直接不及格
    • 上报相关部门
  • 代码会进行结构相似性分析。
  • 仅修改变量名、加几行代码,不能规避抄袭检测。

7. MATLAB 简介

7.1 MATLAB 是什么?

MATLAB = MATrix LABoratory

课程主要使用 MATLAB。

PPT 中提到的版本:

  • R2019b
  • R2013a
  • R2012a

浙江大学相关访问地址:

http://ms.zju.edu.cn/

8. 为什么学习科学计算?

科学计算可用于:

8.1 Simulation 模拟

模拟物理、化学、生物、环境、社会系统。

现实实验可能:

  • 昂贵
  • 缓慢
  • 危险
  • 不可能实施

因此可以用计算机模拟部分替代真实实验。

8.2 Visualization 可视化

用计算机可视化复杂现象,例如:

  • Rayleigh-Taylor instability
  • 两种流体混合
  • 复杂动态系统

8.3 Analysis 分析

计算系统性质:

  • 应力 stresses
  • 温度 temperatures
  • 质量分布 mass distributions
  • 浓度 concentrations

8.4 Optimization 设计优化

通过计算找最优设计参数。

8.5 Nanoscale and Atomistic Systems

分析纳米尺度原子相互作用,从而推导材料性质。

8.6 Combinatorics 组合问题

在大量可能性中寻找答案。

8.7 Data Analysis 数据分析

科学和商业越来越依赖数据。 通过分析大量数据:

  • 发现趋势
  • 发现模式
  • 验证假设

例如 Human Genome Project 人类基因组计划。

8.8 Systems Control 系统控制

现代系统设计中,计算机常作为中央控制单元:

  • 从传感器不断测量数据
  • 设置控制输出

9. Scientific computation 科学计算

科学家和工程师会:

  1. 建立物理问题的数学模型
  2. 计算数学模型的解
  3. 求解非线性方程
  4. 求解优化问题
  5. 求解微分方程,以理解真实世界如何动态变化

9.1 为什么需要 simulations?

真实实验可能:

  • expensive 昂贵
  • slow 慢
  • perilous 危险

计算机模拟可替代或部分替代真实实验。

10. Approximation 近似

科学和工程模型通常都包含近似。

对于物理系统:

  • 所有模型都包含近似
  • 有些模型在一定容忍误差内仍然有预测能力

例子:

  • Newton’s laws 牛顿定律
  • Relativity 相对论

10.1 近似相关问题

需要考虑:

  • Model errors 模型误差
  • Solution errors 解的误差
  • 近似的适用范围
  • 需要的精度
  • 如何验证计算结果 verify calculations
  • 如何验证模型 validate model

11. Aspects of computation 计算的两个方面

11.1 Hardware 硬件

运行计算的机器。

包括:

  • RAM
  • CPU
  • power supply
  • hard drive
  • motherboard
  • videocard

11.2 Software 软件

指导计算的程序。

11.3 计算机例子

ENIAC

  • 日期:1947/7/29
  • 第一台计算机
  • 5000 flops
  • 用于弹道轨迹计算

Blue Gene

  • 时间:2012/06
  • Total Cores:1,572,864
  • Power:7890 KW
  • Memory:1,572,864 GB
  • Rmax:16,324.8 Tflops
  • Rpeak:20,132.7 Tflops

Human brain

估计约比 Blue Gene 强 5 倍。

12. Machine Model 机器模型

12.1 计算机如何处理信息?

计算机系统包括:

  • 高密度存储:hard drive
  • 随机访问内存:RAM
  • 主板和 CPU
  • 外设 / 用户界面
  • 电源

12.2 从高级代码到硬件

程序执行的大致层次:

Applications
High level code
Assembly / machine code
Voltages
Microprocessor
Individual transistors

也就是说,我们写的 MATLAB 代码最终都会被转换成底层机器能够执行的形式。

13. Assembly language 汇编语言示例

如果直接在机器 / 汇编层编程,会很麻烦。

13.1 伪指令集

指令含义
ADD $1, $2, $3$3 = $1 + $2
SUB $1, $2, $3$3 = $1 - $2
MPY $1, $2, $3$3 = $1 * $2
DIV $1, $2, $3$3 = $1 / $2
LT $1, $2, target如果 $1 < $2,跳转到 target
EQ $1, $2, target如果 $1 = $2,跳转到 target

13.2 高级语言的意义

汇编语言编程很痛苦,因此出现了:

  • Java
  • C
  • MATLAB

以及:

  • interpreters 解释器
  • compilers 编译器

它们把人类可读代码转换成低级指令。

例如高级代码:

sum = 0;
for i = 1:500
sum = sum + x(i);
end
avgVal = sum/500;

会被编译 / 解释成底层机器代码。

14. 为什么是 MATLAB?

MATLAB 部分源自 FORTRAN。

FORTRAN = FORmula TRANslation 最初就是为数学公式计算设计的。

MATLAB 使复杂数学表达式求值非常方便。

15. MATLAB Help 和 File Exchange

15.1 MATLAB help system

需要熟悉 MATLAB help 系统。 它包含所有 MATLAB 函数的文档。

常用命令:

help 函数名
doc 函数名
lookfor 关键词

15.2 MATLAB File Exchange

提供大量预写代码和示例。

16. MATLAB 界面

MATLAB 界面通常包括:

区域作用
Editor写 scripts / M-files
Command Window测试代码、调用脚本
Command History记录命令窗口执行过的代码
Workspace当前变量
Current Folder当前工作目录

17. MATLAB Statements 语句

MATLAB 最基本的命令是 statement。

例:

foo = x^2 + sin(5*y) / exp(67*z);

含义:

  • 右边是表达式 expression
  • 左边是变量名
  • MATLAB 计算右边结果并赋值给左边变量

17.1 分号

a = 5;

分号的作用:抑制输出。 如果没有分号:

a = 5

MATLAB 会在命令窗口显示:

a =
5

18. MATLAB Built-in Functions 内置函数

MATLAB 有大量内置函数,例如:

sin(x)
cos(x)
exp(x)
log(x)
atan(x)
cosh(x)
sinh(x)
mean(x)
median(x)

几乎你能想到的数学 / 统计函数,MATLAB 都有。

19. Array basics 数组基础

MATLAB 中数组非常重要。 数组可以理解为一串数字。

19.1 创建数组

x = [1, 3, 9, 11, -10.2];

逗号 , 或空格都可以分隔同行元素:

x = [1 3 9 11 -10.2];

19.2 访问数组元素

MATLAB 下标从 1 开始,不是 0。

foo = x(3);

取出第三个元素。

19.3 修改数组元素

x(2) = 27;

把第二个元素改成 27。

20. Colon operator 冒号创建数组

20.1 基本格式

x = start:stop;

默认步长为 1。

例:

x = 1:15;

生成:

[1 2 3 ... 15]

20.2 指定步长

x = start:step:stop;

例:

x = 4:2:28;

生成:

[4 6 8 ... 28]

例:

x = -1.3:0.1:1.3;

从 -1.3 开始,每次加 0.1,直到不超过 1.3。

20.3 上界不会被超过

例:

x = 1:2:6;

结果:

x = [1 3 5]

不会包含 7,因为超过 6。

21. Operations on arrays 数组运算

21.1 对数组逐元素计算

x = 0:0.1:10;
y = exp(5*x).*sin(x);
plot(x,y);

注意 .*表示逐元素乘法。

21.2 数组加法

两个数组大小相同才能加。

x = [1 2 3 4 5];
y = [7 8 9 10 11];
z = x + y;

结果:

z = [8 10 12 14 16]

减法同理。

21.3 数组乘法和除法

逐元素乘法:

z = x.*y;

逐元素除法:

z = x./y;

补充: * 是矩阵乘法。 .* 是数组对应元素相乘。 / 是矩阵右除。 ./ 是对应元素相除。

21.4 内置函数通常支持数组输入

x = 1:10:1000;
y = sqrt(x);

sqrt(x) 会对 x 中每个元素开平方。

22. Scripts 脚本

22.1 什么是 script?

Script 是 .m 文件,包含一组 MATLAB 语句 / 命令。

22.2 创建脚本

命令行:

My terminal window
edit filename.m

22.3 运行脚本

如果文件名是 filename.m,运行:

My terminal window
filename

也可以按 F5 或点击 Run。

22.4 脚本作用域

脚本可以从:

  • 当前目录 current directory
  • MATLAB search path

中被找到并运行。

23. Current working directory 当前工作目录

MATLAB 有一个当前工作目录。

建议:

  1. 创建一个专门放课程代码的文件夹。
  2. 在 MATLAB 中把当前工作目录设置到那里。
  3. MATLAB 会优先在当前目录查找脚本和函数。

24. Linear algebra primer 线性代数入门

线性方程组可以写成:

A * X = B

其中:

  • A 是系数矩阵
  • X 是未知向量
  • B 是右端项

理论上:

X = A^(-1) B

MATLAB 中一般用:

X = A\B;

比显式 inv(A)*B 更推荐。

25. 打开、运行、中断 M-file

25.1 新建 / 打开脚本

My terminal window
edit newScript

25.2 执行脚本

  • F5
  • 命令窗口输入脚本名
  • 工具栏 Run

25.3 中断程序

如果程序死循环或运行太久:

My terminal window
Ctrl + C

26. Memory 内存与二进制

26.1 bit 和 byte

  • 计算机内存中每个位置存储有限个二进制位 bit。
  • 常见存储大小:
    • 8 bits
    • 16 bits
    • 32 bits
    • 64 bits
  • 8 bits = 1 byte

26.2 二进制表示非负整数

例:

1011₂ = 8 + 2 + 1 = 11₁₀
110010₂ = 32 + 16 + 2 = 50₁₀
11111111₂ = 255₁₀

8 bit 无符号整数最大是:

255

27. Overflow 溢出

内存位置大小固定,因此能表示的数值范围有限。

例:

X = uint8(78);
Y = uint8(190);
Z = X + Y;

理论上:

78 + 190 = 268

uint8 最大只能表示 255,因此结果会被截断 / 饱和到 255。

27.1 常见无符号整数范围

类型范围
8 bit unsigned0–255
16 bit unsigned0–65535
32 bit unsigned0–约 4 billion,即 2^32 - 1

28. Floating point 浮点数

科学计算中不仅有整数,还有:

  • 有理数,例如 0.335-27.890
  • 无理数,例如 pie

计算机通常用有限精度近似表示它们。

28.1 科学计数法

例:

+2.1345e17

包含:

  • sign 符号
  • mantissa 尾数,例如 2.1345
  • exponent 指数,例如 17

28.2 IEEE floating point

Single precision 单精度

总共 32 bits:

  • 1 bit sign
  • 8 bits exponent
  • 23 bits mantissa

Double precision 双精度

总共 64 bits:

  • 1 bit sign
  • 11 bits exponent
  • 52 bits mantissa

MATLAB 默认使用 double

29. Floating point arithmetic 的问题

浮点数位数有限,因此每次数值运算都可能损失信息。

例如如果只能保留小数点后 2 位:

5.43 x 10^6
+ 7.43 x 10^4
= 5.5043 x 10^6

但存储时可能只能保存部分数字,后面数字会被舍入。

29.1 Take-home message

计算机并不像你想象的那样擅长精确算术。

浮点计算结果通常应看作近似值。

30. Numerical analysis 数值分析

为了获得可靠结果,需要仔细设计代码,避免或减少:

  • roundoff error 舍入误差
  • other imprecision 其他不精确性

专门研究这些问题的人叫:

numerical analysts

31. MATLAB number types

可以用 whos 查看变量存储类型。

常见类型:

| 类型 | 含义 | | — | | | uint8 | 无符号 8 bit 整数 | | int64 | 有符号 64 bit 整数 | | double | 双精度浮点数 | | single | 单精度浮点数 |

指定类型例子:

x = int32(67);

32. 数组与数值类型

数组中所有数值通常共享同一种数值类型。

x = uint16([1 3 4 5 89]);
x = single(0:0.1:100);

33. It’s all bits

计算机中所有信息最终都是 bits:

  • 数字
  • 文本
  • 图像
  • 声音

34. 文本、声音、图像表示

34.1 Text 文本

ASCII code 给每个字符和符号一个数字。

MATLAB 中字符串可看作整数数组。

MATLAB 用 16 bit Unicode 表示字符。

34.2 Sound 声音

声音可表示为随时间变化的采样数值数组。

34.3 Images 图像

图像是二维数值数组。

彩色图像每个像素存三个数:

  • Red
  • Green
  • Blue

即 RGB 三个通道。

35. Useful MATLAB commands

命令作用
whos列出 workspace 当前变量及其类型
clear清除 workspace 中所有变量或指定变量
clc清空命令窗口,不影响 workspace

例:

clear
clc
whos

Lec 2:Scripts、Functions、循环、条件、逻辑向量

1. M-file

M-file 是存储在 MATLAB .m 文件中的一组指令。

M-file 可以是:

  • script 脚本
  • function 函数

2. Functions vs. Scripts

2.1 Function 示例

function d = myFunFunction(a,b,c)
% Takes scalar values a, b, and c, modifies and sums the values
% Modifying the input values
var1 = 2*a;
var2 = b^2;
var3 = sqrt(c);
% Calculating the output
d = var1 + var2 + var3;

特点:

  • 第一行以 function 开头
  • 输入:a,b,c
  • 输出:d
  • 函数内部变量不会自动出现在外部 workspace

2.2 Script 示例

% Define values of scalars a, b, and c
a = 1;
b = 2;
c = 15;
% Modifying the scalar values a, b, and c
var1 = 2*a;
var2 = b^2;
var3 = sqrt(c);
% Calculating the sum of the modified scalar values
d = var1 + var2 + var3;

特点:

  • 没有 function 开头
  • 变量直接存在于当前 workspace 中
  • 运行后 a,b,c,var1,var2,var3,d 都可能留在 workspace

3. Functions 和 Scripts 的共同点

二者都:

  • 存在 .m 文件中
  • 使用 Editor 窗口编辑
  • 是独立代码块
  • 可以从 Command Window 调用
  • 可以被其他函数调用

4. 为什么用 Scripts?

4.1 Script 是什么?

MATLAB M-file,其中所有变量、常量等都在文件中调用。

4.2 为什么写 script?

因为:

  • 可能需要多行代码解决问题
  • 一直在 Command Window 重复输入很麻烦
  • Command Window 不方便保存代码
  • Script 便于注释、修改、debug

5. 为什么用 Functions?

5.1 Function 是什么?

function 开头的 MATLAB M-file。

通常:

  • 传入 input
  • 返回 one or several outputs

5.2 为什么使用 function?

函数是一个 black box 黑箱。

优点:

  • 功能测试 / 验证后可反复使用
  • 不必每次质疑输出
  • 可把复杂计算拆分成小代码块
  • 支持 top-down program design 自顶向下设计

6. Scripts vs. Functions 的形象理解

PPT 用“火箭”和“星球”类比:

function [out1,out2,out3] = mars(in1,in2)
function [out1,out2] = saturn(in1)
  • 火箭携带 inputs 和 outputs。
  • Mars 函数看不到 Earth 上的变量,除非变量作为 input 被火箭带过去。
  • 函数内部有自己的 workspace。

7. Function 语法

7.1 单输入单输出

function output = myFunc(input)

7.2 多输入多输出

function [output1,output2,output3] = myFunc(input1,input2,input3)

注意:函数定义第一行应写在同一行。

7.3 命名和保存规则

  • 函数名必须以字母开头。
  • 保存文件名必须和函数名一致。

例如:

function y = squareMe(x)
y = x^2;
end

文件必须保存为:

squareMe.m

8. Newton’s Method 牛顿法求平方根

目标:只用 + - * / 求给定数 a 的平方根。

考虑函数:

y(x) = x^2 - a

平方根对应:

x^2 - a = 0

即求这个函数的根。

8.1 牛顿法思想

在当前点 x:

  1. 用切线近似函数
  2. 求切线与 x 轴交点
  3. 用交点作为新的 x
  4. 重复直到足够接近

8.2 算法

初值:

x = a/2;

循环条件:

abs(x^2 - a) > 1.0e-6

每步:

y = x^2 - a;
gradient = 2*x;
step = -y/gradient;
x = x + step;

对应文件:

my_sqrt.m

函数:

my_sqrt(a)

9. 如何调用函数?

可以:

  1. 从 command line 调用,必须包含 inputs。
  2. 从其他函数调用。

例:

result = my_sqrt(2);

10. Function H1 line 和 help

10.1 H1 line

函数第一行注释称为 H1 line,可被 lookfor 搜索。

例:

function out1 = testFunction(in1)
% A test function
% This would report, in the help function, all of the functionality of the
% function
% in1 = function input (units: not specified)
% out2 = function output (units: not specified)

10.2 help 查询

函数开头连续注释块会作为 help 信息返回。

help testFunction

11. Recursive functions 递归函数

函数可以调用自己,这叫 recursive function。

例:

function recursiveAdd(nToAdd)
% Adds a number to the input up to
% a value of 25
if nToAdd < 25
nToAdd = nToAdd + 1;
disp(nToAdd)
recursiveAdd(nToAdd);
end

递归必须有终止条件,否则会无限调用。

12. 函数调用时发生什么?

  1. 实参 arguments 被复制到输入参数 input parameters。
  2. 函数体在自己的 private workspace 中运行。
  3. 函数不能看见调用环境中的变量。
  4. 函数结束时,输出参数被复制回调用环境。
  5. MATLAB 通过 search path 查找函数:
    • 当前目录优先
    • 然后搜索路径中的其他目录

13. Search paths 搜索路径

MATLAB 调用函数 / 脚本时,会搜索一系列文件夹,即 search path。

包含:

  • current working folder
  • MATLAB 安装时自带 toolbox 文件夹
  • 用户添加的路径

13.1 查看路径

path

13.2 设置启动工作目录

userpath('C:\MyMATLABwork')

13.3 添加路径

addpath('某个文件夹路径')

13.4 删除路径

rmpath('某个文件夹路径')

14. 函数变量去哪了?

14.1 Script 变量会保留

除非清除,script 中产生的变量会留在 workspace。

14.2 Function 变量不会保留

函数内部变量局限于函数 workspace。

PPT 总结:

Whatever happens in a function, stays in a function.

15. 清理 workspace 和 command line

15.1 清除变量

clear

也可以清除指定变量:

clear x y

15.2 清空命令窗口

clc

15.3 注意

不要在 function 内随便调用 clear

clear 通常在:

  • script
  • command line

中使用。

16. 注释代码

16.1 注释原则

一般规则:至少每三行代码有一行注释。

注释有助于:

  • 别人理解代码
  • 别人 debug
  • 助教 / 老师评分

16.2 快捷键

操作快捷键
注释选中代码Ctrl + R
取消注释Ctrl + T

17. Example 1:Monthly Loan Payment

固定利率按揭贷款。

输出:

  • monthly payment c

输入:

  • loan amount P0
  • interest rate r
  • number of monthly payments N

文件:

loan.m

18. Example 2:Evaluating an Expression

要求写一个函数文件计算某表达式,并允许 x 是向量。

计算:

  • f(x) for x = 6
  • f(x) for x = 1,3,5,7,9,11

文件:

Ex10_2.m

补充:如果函数要支持向量输入,应使用逐元素运算: .*./.^

19. Example 3:Converting Temperatures

写函数把华氏度 °F 转换为摄氏度 °C。

文件:

FtoC.m

公式:

C = 5*(F - 32)/9;

如果支持向量:

C = 5*(F - 32)./9;

19.1 热膨胀问题

长度变化:

DL = a*L*DT;

其中:

  • a:热膨胀系数
  • L:长度
  • DT:温度变化

题目:

矩形铝板:

  • 4.5 m × 2.25 m
  • a = 23x10^-6 / °C
  • 温度从 40°F 到 92°F

求面积变化。

20. Anonymous Function 匿名函数

适合短的一行计算。

20.1 一般形式

function_name = @(arguments) expression

例:

FtoC = @(F) 5*(F-32)./9;
cube = @(x) x^3;
circle = @(x,y) 16*x^2 + 9*y^2;

补充: 如果输入可能是向量,cube 应写成:

cube = @(x) x.^3;

20.2 匿名函数例子

FA = @(x) exp(x^2)/sqrt(x^2+5);
FA(2)

支持向量时:

FA = @(x) exp(x.^2)./sqrt(x.^2+5);
FA([1 0.5 2])

双变量:

HA = @(x,y) 2*x^2 - 4*x*y + y^2;
HA(2,3)

如果支持数组输入:

HA = @(x,y) 2*x.^2 - 4*x.*y + y.^2;

21. Subfunctions 子函数

一个 function file 可以包含多个用户定义函数。

  • 第一个函数叫 primary function。
  • 文件名对应 primary function。
  • 其他函数叫 subfunctions。
  • subfunctions 只在该文件内部可见。
  • 每个函数都有自己的 workspace。
  • 常用于 utility calculations。

22. Example 4:Mean and Standard Deviation

写函数计算一组数的:

  • mean 平均值
  • standard deviation 标准差

文件:

stat.m

23. Function Functions

MATLAB 内置函数 fzero 可找函数零点:

f(x) = 0

问题:如何把函数 f(x) 描述给 fzero

两种方式:

  1. Function handle
  2. Function name string

24. Function Handles 函数句柄

函数句柄是一种数据类型,保存和函数相关的唯一值。

24.1 获得方式

@function_name
@cos
@FtoC

如果 FtoC 是匿名函数,则直接用变量名 FtoC

例:

f = @cos;
f(0)

文件:

funplot.m
Fdemo.m

25. Function Names in Strings

较老方法,效率较低。

传入函数名字符串:

'cos'
'FtoC'

feval 执行:

var = feval('function_name', arguments);

文件:

funplotS.m

26. 解决真实问题的策略

Start simple and build to complexity

先从简单问题开始,再逐步增加复杂性。

27. 初始化向量

27.1 离散输入

x = [0.5, 1.5, 2, 3.2, 1.5, 0.4];

27.2 冒号

x = 1:1:5;
x = 1:5;
x = -5:2:5;

27.3 linspace 和 logspace

x = linspace(1,5,5);
x = logspace(1,5,5);

linspace(a,b,n):从 a 到 b 均匀取 n 个点。 logspace(a,b,n):从 10^a10^b 按对数均匀取 n 个点。

28. 访问向量元素

假设:

x = [5, 9, 4, 1, 7, 3, 4, 8];

28.1 第一个元素

y = x(1);

结果:

y = 5

28.2 范围索引

y = x(1:3);

结果:

[5 9 4]
y = x(6:8);

结果:

[3 4 8]

28.3 最后一个元素

y = x(end);

结果:

8

28.4 偏移索引

y = x(1+4);

x(5),结果:

7

28.5 倒数第三个元素

y = x(end-2);

结果:

3

28.6 离散索引

y = x([1 3 6]);

结果:

[5 4 3]

29. 修改 / 添加向量元素

假设:

x = [1, 2, 3];

29.1 覆盖第一个元素

x(1) = 5;

结果:

[5 2 3]

29.2 覆盖最后一个元素

x(end) = 1;

结果:

[5 2 1]

29.3 添加一个末尾元素

x(end+1) = 8;

结果:

[5 2 1 8]

29.4 添加多个末尾元素

错误写法:

x(end+1) = [6, 9];

因为左边只有一个位置,右边有两个数,维度不匹配。

正确写法:

x(end+1:end+2) = [6, 9];

结果:

[5 2 1 8 6 9]

30. 删除向量元素

用空数组 [] 删除。

假设:

x = [8, 4, 5, 9, 3, 2, 5, 6];

30.1 删除第一个元素

x(1) = [];

结果:

[4 5 9 3 2 5 6]

30.2 删除多个元素

x(end-3:end) = [];

结果:

[8 4 5 9]

31. for loops

公式向量化通常更快,但有时需要循环。

31.1 基本 for 循环

for jj = 1:20
disp(jj)
end

输出 1 到 20。

当迭代次数已知时,for 循环优于 while 循环。

31.2 任意冒号表达式

for jj = 1:3:19
disp(jj)
end

输出:

1 4 7 10 13 16 19

31.3 离散向量循环

for jj = [1 9 5]
disp(jj)
end

依次输出 1、9、5。

31.4 嵌套循环

for jj = 1:10
for kk = 1:10
disp([jj kk])
end
end

每一个 for 都需要一个 end

32. Relational operators 关系运算符

关系运算符比较数值并返回 true 或 false。

MATLAB 中:

  • true 表示 1
  • false 表示 0
运算符含义
<小于
<=小于等于
==等于
~=不等于
>大于
>=大于等于

注意:

=

是赋值。

==

才是判断相等。

33. while loops

33.1 基本语法

while <relationalExpression>
<expressionToEvaluate>
end

PPT 中 End 应为 MATLAB 语法 end,大小写一般 MATLAB 可接受,但习惯小写。

33.2 简单例子

a = 1;
while a < 10
a = a + 1;
end

循环结束时:

a = 10

while 循环适合不知道迭代次数的情况。

34. for 和 while 实现 n 次迭代

34.1 for loop 牛顿法

n = 100;
a = 2;
x = a/2;
for ii = 1:n
x = (x + a/x)/2;
end

34.2 while loop 牛顿法

n = 100;
a = 2;
x = a/2;
ctr = 0;
while ctr < n
ctr = ctr + 1;
x = (x + a/x)/2;
end

二者没有明显时间优势,取决于代码可读性和你习惯哪种。

35. Vectorization 向量化

考虑:

a = rand(1,N);

希望计算:

b_i = a_i * a_i

有三种方式:

a.^2
a.*a
for loop

向量化更快,通常可快几个数量级。

35.1 性能比较代码

clear; clc; close all
n = round(logspace(0,8,20));
for jj = 1:length(n)
a = rand(1,n(jj));
clear b
tic
for kk = 1:length(a)
b(kk) = a(kk)*a(kk);
end
t_for(jj) = toc;
clear b
tic
b = a.*a;
t_vect(jj) = toc;
end
[ph] = plot(n,t_for,'k.-',n,t_vect,'r.-');
set(ph(1),'LineWidth',4,'MarkerSize',25)
set(ph(2),'LineWidth',4,'MarkerSize',25)
set(gca,'YTick',logspace(-10,10,21))
set(gca,'XTick',logspace(0,20,21))
set(gca,'XScale','log','YScale','log')
set(gca,'FontSize',20)
set(gca,'FontName','Arial')
lg = legend('For loop','Vector');
set(lg,'Location','NorthWest')
xlabel('Number of array elements')
ylabel('Evaluation Time (s)')

补充:

  • tic 开始计时。
  • toc 返回从上次 tic 开始经过的时间。

36. if statement

36.1 基本语法

if condition
statements
end

例:

a = 1;
if a == 1
disp('a is equal to 1! Yay!')
end

37. Nested if 嵌套 if

a = 1;
b = 2;
if a == 1
if b == 2
disp(['a is equal to 1',...
'and b is equal to 2.',...
'Double yay!'])
end
end

38. Boolean expressions / logical operators

逻辑运算符可以避免过多嵌套。

标量逻辑符向量 / 标量逻辑符含义
&&&and,与
``

38.1 用 && 合并条件

a = 1;
b = 2;
if a == 1 && b == 2
disp(['a is equal to 1',...
'and b is equal to 2.',...
'Double yay!'])
end

39. if / elseif / else

当有多个条件时:

if condition1
statements1
elseif condition2
statements2
else
statements3
end

PPT 例子提到 FEM shape function。

40. Logical operators 完整表

标量向量函数形式含义
&&&and(a,b)And
```
xor(a,b)Or exclusive
~~not(a)Not / complement

40.1 or 与 xor 真值表

abor(a,b)xor(a,b)
FFFF
FTTT
TFTT
TTTF

区别:

  • or:只要至少一个真就真。
  • xor:只有一个真时才真,两个都真反而是假。

41. Logical NOT

NOT 只需要一个输入,返回逻辑相反值。

not(0) % 1
~0 % 1
not(1) % 0
not(3) % 0

非零值在逻辑中都视为 true。

42. Logical scalars 逻辑标量

例:

a = 3 > 2; % 1
a = 2 > 3; % 0
a = 2 >= 2; % 1
a = 2 ~= 2; % 0
a = 2 == 2; % 1
a = ~1; % 0

逻辑类型比 double 更省内存:

  • logical:1 byte
  • double:8 bytes

43. Logical vectors 逻辑向量

逻辑向量是由 0 和 1 组成的向量,表示某个条件对每个元素是否成立。

例:

a = [0 4 9 7 3 5] <= 4;

结果:

[1 1 0 0 1 0]

44. 创建逻辑向量

44.1 关系运算得到

a = [1 6 5] < 2;

结果:

[1 0 0]

44.2 直接指定

a = logical([1 0 0]);

如果不调用 logical,MATLAB 会创建 double 类型的 [1 0 0]

45. Logical vector rules

例:

x = [5 9 2 4 3];
v = logical([1 0 1 0 1]);
xp = x(v);

结果:

xp = [5 2 3]

规则:

  1. v 必须是 logical 类型。
  2. 返回 x 中对应 v 为 true 的元素。
  3. xv 必须大小相同。

46. 逻辑向量例子

x = [1 4 3 6 2 8];
v = x > 3;

结果:

v = [0 1 0 1 0 1]
v = x < -3;

结果:

[0 0 0 0 0 0]
v = ~(~x);

由于 x 全非零,所以:

[1 1 1 1 1 1]

47. 逻辑向量应用:sin(x)

目标:把 sin(x) 中负值设为 0。

47.1 方法 1:for + if

x = 0:pi/1000:3*pi;
y = sin(x);
for jj = 1:length(y)
if y(jj) < 0
y(jj) = 0;
end
end
plot(x,y,'k.')

47.2 方法 2:逻辑向量

x = 0:pi/1000:3*pi;
y = sin(x);
y = y.*(y > 0);
plot(x,y,'k.')

更高效。

47.3 绘图代码

x = 0:pi/100:4*pi;
y = sin(x);
yp = y.*(y>0);
pl = plot(x,y,'k-',x,yp,'r-');
set(gca,'FontSize',18)
set(pl(1),'LineWidth',10)
set(pl(2),'LineWidth',4)
axis([0 4*pi -1.2 1.2])
xlabel('x'), ylabel('y or y_p')
lg = legend('y=sin(x)',...
'y_p=sin(x), y_p=0 for y<0');

48. 逻辑向量应用:tan(x)

原始代码:

x = 0*pi:pi/10000:pi;
y = tan(x);
plot(x,y)
xlim([0 pi])
xlabel('x')
ylabel('y')

由于 tan 在 pi/2 附近有渐近线,图像细节会被大值支配。

48.1 大值设为 0

x = 0*pi:pi/10000:pi;
y = tan(x);
y = y.*(abs(y)<15);
plot(x,y)

48.2 大值设为 NaN

x = 0*pi:pi/10000:pi;
y = tan(x);
y(abs(y)>15) = NaN;
plot(x,y)

NaN 不会被正常连线绘制,因此能断开渐近线附近的图。

48.3 删除大值

x = 0*pi:pi/10000:pi;
y = tan(x);
x = x(abs(y)<15);
y = y(abs(y)<15);
plot(x,y)

49. Example:Sieve of Eratosthenes 埃拉托色尼筛法

目标:找出 1 到 n 的所有质数。

质数定义:

  • 只能被 1 和自身整除
  • 必须是大于 1 的整数

算法:

  1. 列出从 2 到 n 的数。
  2. 当前列表第一个数一定是质数,把它加入质数列表。
  3. 划掉该数的所有倍数。
  4. 重复步骤 2–4,直到当前质数大于等于 sqrt(n)
  5. 剩余所有数都是质数。

该算法使用:

  • logical expressions
  • logical indexing

Lec 3:矩阵、多维数组、矩阵运算、稀疏矩阵、数组函数

1. What is a matrix?

矩阵是二维数组,由:

  • rows 行
  • columns 列

组成。

例如一个 3 行 3 列矩阵大小为:

3 x 3

2. Multidimensional Array / Matrix

数据类型可从低维到高维理解:

| 类型 | 含义 | | - | | | Scalar | 标量,一个数 | | Vector | 向量,一维数组 | | Matrix / Array | 矩阵 / 二维数组 | | Multidimensional Matrix / Array | 多维数组 |

三维数组可以理解为多个二维矩阵沿第三维堆叠。

3.1 方括号

用于创建数组。

数组数据按行列组织,每行长度必须相同。

行内元素

用逗号或空格:

A = [1 2 3];
A = [1, 2, 3];

换行

用分号:

A = [1 2 3; 4 5 6];

结果是 2×3 矩阵。

3.2 冒号

用于创建大数组和等间距数据。

默认步长为 1

first_value:last_value

自定义步长

first_value:step:last_value

例:

[f:n]

生成:

[f, f+1, f+2, ..., k]

其中 k <= nk+1 > n。 如果 f > n,则结果为空数组 []

4. Creating arrays 创建数组

4.1 创建一维数组 / 向量

常间距向量

My_variable = [first:spacing:last];
A = [1:5];
A = [1:2:5];

也可以不写方括号:

My_variable = first:spacing:last;
x = 1:5;
x = 1:0.5:5;

linspace

My_variable = linspace(first, last, num);
B = linspace(1,50,10);

表示从 1 到 50 均匀取 10 个点。

任意向量

A = [1 3 0 -2 5 6 10];

5. Creating matrices 创建二维矩阵

5.1 手动创建

A = [1 2 3; 4 5 6];

结果:

1 2 3
4 5 6

5.2 内置函数

A = ones(2,5);
A = zeros(2,3);
A = eye(3);
函数含义
ones(m,n)创建 m×n 全 1 矩阵
zeros(m,n)创建 m×n 全 0 矩阵
eye(n)创建 n×n 单位矩阵

6. Transpose operator 转置 '

A'

作用:

  • 行变列
  • 列变行
  • m×n 矩阵变 n×m 矩阵
  • 列向量变行向量
  • 行向量变列向量

例:

A = [1 2 3; 4 5 6];
A'

结果:

1 4
2 5
3 6

7. 使用表达式初始化数组

数组初始化表达式可以包含:

  • 算术运算
  • 已定义数组的全部或部分

例:

a = [0 13*2];

结果:

a = [0 26]
b = [a(2) 13 a];

结果:

b = [26 13 0 26]

8. Accessing matrix indices 矩阵索引

8.1 二维下标访问

格式:

A(row, column)

例如:

A(3,1)

表示第 3 行第 1 列。

9. 单下标访问矩阵

矩阵也可以用单个下标访问。 MATLAB 按列展开矩阵,即 column-major order:

从左上角开始,先沿第一列向下,再第二列向下。

对 3×3 矩阵,单下标顺序:

1 4 7
2 5 8
3 6 9

也就是说 A(1) 是第一行第一列,A(2) 是第二行第一列。

10. Subarrays 子数组

10.1 向量

va(:)

所有元素。

va(m:n)

第 m 到第 n 个元素。

10.2 矩阵

语法含义
A(:,n)第 n 列所有元素
A(n,:)第 n 行所有元素
A(:,m:n)第 m 到第 n 列
A(m:n,:)第 m 到第 n 行
A(m:n,p:q)第 m 到 n 行、第 p 到 q 列

10.3 end

end 表示对应维度的最大索引。

例:

a = [1 2 3 4 5 6 7 8 9];
a(7:end)

结果:

[7 8 9]
a(end)

结果:

9

10.4 同一表达式中 end 可代表不同维度

b = [1 2 3 4; 5 6 7 8; 9 10 11 12];
b(2:2:end,2:end)

含义:

  • 行:从第 2 行到最后一行,每隔 2 行取一次
  • 列:第 2 列到最后一列

结果:

[6 7 8]

11. Manipulating / creating arrays

包括:

  • 添加元素 expanding
  • 删除元素
  • 内置数组函数

12. Resizing arrays 调整数组大小

12.1 length

返回元素个数,或数组最大维度长度。

length(v)

12.2 size(A)

返回矩阵大小:

[m,n] = size(A);

或者:

size(A)

返回:

[m n]

12.3 reshape(A,m,n)

重排 A,使其有 m 行 n 列。

B = reshape(A,m,n);

注意:元素总数必须一致。

12.4 diag(v)

如果输入是向量,创建以该向量为主对角线的方阵。

diag([1 2 3])

结果:

1 0 0
0 2 0
0 0 3

12.5 diag(A)

如果输入是矩阵,返回主对角线元素向量。

12.6 自动扩展

A(end+1) = 5;

自动添加一个元素。

12.7 删除行或列

A(:,2) = [];

删除第 2 列。

12.8 拼接数组

A = [B C; D E];

含义:

左上 B,右上 C
左下 D,右下 E

前提是维度能对齐。

13. 对角线元素

如何指定矩阵 A 的对角线元素?

方法 1:

a = [A(1,1) A(2,2) A(3,3)];

方法 2:单下标

a = A(1:5:9);

对 3×3 矩阵,主对角线单下标为 1,5,9。

方法 3:

a = diag(A);

工程中对角线元素常很重要,例如 stress tensor 中的 normal stresses。

14. Strings 字符串

MATLAB 字符串可以是单引号中的字符数组。

例:

'ad ef'
'CSCSI0040'
'Ruth Simmons'
'99.99% pure'
'Exclaiming text!'

14.1 字符串中包含单引号

用两个单引号表示一个单引号:

'text with a quote''in it'

14.2 char 函数

My_string = char('string 1','string 2','string 3');

创建字符数组。

14.3 字符串相关函数

例如:

lower
isspace
isletter

15. Matrix Math 矩阵数学

内容包括:

  • addition / subtraction
  • multiplication
  • division
  • array math
  • array operations

16. Array addition and subtraction

规则:

  1. 标量可以加到任意数组,标量会加到每个元素。
  2. 数组之间加减必须维度相同,对应位置逐元素加减。

16.1 标量扩展 scalar expansion

A = [1 2; 3 4];
B = A + 2;

结果:

B = [3 4; 5 6]

16.2 数组维度必须一致

B = A + [3 4];

报错:

matrix dimensions must agree
B = A + [3 4; 5 6];

结果:

B = [4 6; 8 10]

17. Element-by-element operations

数组大小必须一致。

操作语法
加法+
减法-
逐元素乘法.*
逐元素除法./
逐元素幂.^

内置函数如:

sin(A)
log(A)

会对数组每个元素分别计算。

18. Matrix / array multiplication

18.1 标量乘数组

B = 2*A;

MATLAB 把标量扩展到数组每个元素。

18.2 矩阵乘法

如果:

A: 4 x 3
B: 3 x 2

则:

A*B: 4 x 2

要求前一个矩阵列数等于后一个矩阵行数。

18.3 * 与 .*

A = [1 2; 3 4];

矩阵乘法:

B = A*[1 2; 3 4];

结果:

B = [7 10; 15 22]

逐元素乘法:

B = A.*[1 2; 3 4];

结果:

B = [1 4; 9 16]

19. Vector multiplication 向量乘法

19.1 行向量 × 列向量

结果是标量,即 dot product。

19.2 列向量 × 行向量

结果是矩阵。

19.3 Cross product

叉乘是特殊操作,使用:

cross(a,b)

20. Matrix division 矩阵除法

20.1 Identity matrix 单位矩阵

单位矩阵 I 是 n×n 方阵:

  • 对角线为 1
  • 其他位置为 0

满足:

AI = IA = A

20.2 Inverse matrix 逆矩阵

如果:

BA = AB = I

则 B 是 A 的逆矩阵。

MATLAB:

inv(A)
A^-1

注意:

  • A 必须是方阵
  • A 必须可逆

21. Left division 左除

求:

AX = B

理论:

X = A^(-1)B

MATLAB 推荐:

X = A\B;

不要优先使用:

X = inv(A)*B;

因为 A\B 更快更稳定。

22. Right division 右除

求:

XC = D

理论:

X = D C^(-1)

MATLAB:

X = D/C;

文件:

L9.m

23. Gaussian Elimination 高斯消元

可用于解线性方程组:

AX = B

或:

XC = D

文件:

L9.m

24. Transposing arrays

转置是沿主对角线反射矩阵。

A'

行向量转置为列向量,列向量转置为行向量。

25. Rotating and flipping arrays

MATLAB 可以旋转和翻转矩阵。

函数作用
rot90(A)逆时针旋转 90°
fliplr(A)左右翻转
flipud(A)上下翻转
flipdim(A,dim)沿指定维度翻转

25.1 图像和矩阵的关系

图像的垂直轴通常和用户定义矩阵的垂直轴方向相反。

因此处理图像和矩阵混合问题时,可能需要翻转。

25.2 生成图像示例代码

figure(1)
load('spine','X','map')
imagesc(X)
colormap(map)
set(gca,'FontSize',20)
set(gcf,'Color','w')
xlabel('Index')
ylabel('Index')
figure(2)
rndArr = rand(367,490);
surface(rndArr)
set(gca,'FontSize',20)
set(gcf,'Color','w')
xlabel('Index')
ylabel('Index')
axis tight
colormap('gray')
shading interp

26. flipdim

rot90fliplrflipud 要求二维矩阵。 flipdim 可以处理任意维度数组。

flipdim(A,1)
flipdim(A,2)
flipdim(A,3)

分别沿第 1、2、3 维翻转。

注:较新 MATLAB 中 flipdim 已逐渐被 flip(A,dim) 替代。

27. Built-in matrices 内置矩阵

MATLAB 有很多预定义矩阵函数。

27.1 指定尺寸

单个参数:

zeros(3)

创建 3×3 矩阵。

两个参数:

ones(2,3)

创建 2×3 矩阵。

某些函数支持 N 维数组:

rand(m,n,p)
randi(m,n,p)

27.2 常见函数

zeros(3)
ones(2,3)
magic(3)
eye(3)
rand(2,3,5)
randi(10,3,5,4)
函数含义
zeros全 0
ones全 1
magic(n)魔方矩阵,每行每列和相等,只允许 n×n 且 n>2
eye(n)单位矩阵
rand0 到 1 均匀随机数
randi随机整数

28. Sparse matrices 稀疏矩阵

稀疏矩阵适用于大部分元素为 0 的矩阵。

应用:

  • search algorithms
  • atomistics
  • stress / strain mapping
  • FEM

优点:

  • 减少内存
  • 加快计算

28.1 常规创建大矩阵

假设矩阵大小 1000×2000,共 2 million 数据点。

非零元素:

(3,4) = 15
(100,1500) = 5
(1000,2000) = 9

常规方法:

A = zeros(1000,2000);
A(3,4) = 15;
A(100,1500) = 5;
A(1000,2000) = 9;

28.2 sparse 创建

A = sparse([3,100,1000],...
[4,1500,2000],...
[15,5,9],1000,2000);

语法:

sparse(row_indices, column_indices, values, m, n)

28.3 full 转 sparse

A = sparse(A);

28.4 节省效果

| Matrix type | Memory | Time to compute A.^2 | | — | -: | : | | Full | 15.2 MB | 4 ms | | Sparse | 0.015 MB | 0.04 ms |

29. Array size

常用函数:

函数作用
size(A)返回所有维度大小
length(A)返回最大维度长度
numel(A)返回元素总数

例:若 A 是 2×8 矩阵:

size(A)

结果:

[2 8]
length(A)

结果:

8
numel(A)

结果:

16

30. General built-in array functions

大多数 MATLAB 内置函数可对 N 维数组逐元素操作。

A 是 100×200 矩阵:

tan(A)

结果仍是 100×200,每个位置是对应元素的 tangent。

类似:

abs(A)
sin(A)
log10(A)

31. Summing array elements

31.1 对某个维度求和

sum(A,N)

表示沿第 N 维求和。

31.2 对整个二维矩阵求和

sum(sum(A))

对于 N 维数组,需要嵌套 N 次 sum

例:

sum(sum(sum(A)))

用于三维数组求总和。

31.3 PPT 中 3D array 求和

PPT 展示了某个 3D 数组,并问:

sum(A)
sum(sum(A))
sum(sum(sum(A)))
sum(A,3)

这里重点掌握规则:

  • sum(A) 默认沿第一个非 singleton 维度求和,通常是第 1 维,即按列压缩行。
  • sum(sum(A)) 再沿新的第 1 个非 singleton 维度继续求。
  • sum(sum(sum(A))) 得到所有元素总和。
  • sum(A,3) 沿第三维求和,即把不同 page 的对应元素相加。

32. Cumulative sums 累积和

函数:

cumsum()

默认沿第一个非 singleton 维度累积求和。

例:

cumsum([1 2 3 4 5])

结果:

[1 3 6 10 15]

例:

cumsum([1 2 3; 4 5 6])

结果:

[1 2 3; 5 7 9]

因为默认沿第 1 维,也就是每一列向下累加。

33. Product 乘积

函数:

prod()

沿第一个非 singleton 维度计算乘积。

例:

x(:,:,1) = [1 2 3; 4 5 6];
x(:,:,2) = [6 5 4; 3 2 1];
y = prod(x)

结果:

y(:,:,1) = [4 10 18]
y(:,:,2) = [18 10 4]

因为每一页中按列乘:

第一页:

[1*4, 2*5, 3*6] = [4 10 18]

第二页:

[6*3, 5*2, 4*1] = [18 10 4]

33.1 另一个例子

x(:,:,1) = [1 2 9];
x(:,:,2) = [3 2 1];
y = prod(x)

结果:

y(:,:,1) = 18
y(:,:,2) = 6

34. Cumulative product 累积乘积

函数:

cumprod()

沿第一个非 singleton 维度计算累积乘积。

例:

x(:,:,1) = [1; 2; 3];
x(:,:,2) = [2; 2; 2];
y = cumprod(x)

结果:

y(:,:,1) = [1; 2; 6]
y(:,:,2) = [2; 4; 8]

Lec 4:文件输入输出、2D 绘图、3D 绘图、图形句柄与动画

1. input command 输入命令

1.1 数值输入

in1 = input('Enter data: ');

用户输入会被存储为数值或 double 类型数组。

例:

用户输入:

[1 2 3]

in1 是 double 数组。

1.2 字符串输入

in2 = input('Enter data: ', 's');

's' 表示输入作为 string / character array 存储。

文件:

L14.m

2. Output Commands 输出命令

2.1 disp

disp(variable)
disp('text to print')

用于简单显示变量或文本。

2.2 fprintf

fprintf(format,data)

功能:

  • 格式化输出到屏幕
  • 或保存到文件
  • 选项很多,参考 Help

fprintfdisp 更灵活,可控制:

  • 小数位
  • 换行
  • 字符串格式
  • 对齐方式

这是以后学习 C 语言时也会见到的概念。

3. Files in MATLAB

3.1 文件本质

文件在硬盘上以 bytes 序列存储。

文件格式用于解释内容,有时由后缀表示:

.txt
.m
.mat
.doc
.ppt

3.2 文件系统

文件存储在 File System 中,可以用目录结构组织信息。

3.3 MATLAB 文件

Scripts 和 functions 存储在 .m 文件中。 .m 文件本质是简单文本文件,可用 MATLAB Editor 编辑。

3.4 保存和读取变量

MATLAB session 中的变量可用:

save
load

保存和读取。

4. save command

4.1 保存 workspace 所有变量

save('file_name');

或:

save file_name;

会写入:

file_name.mat

.mat 是 MATLAB 二进制格式。

4.2 只保存部分变量

save file_name var1 var2;

4.3 保存为可读文本格式

save -ascii file_name;

优点:

  • 可被其他应用读取
  • 平台无关
  • 易于传输数据

5. load command

5.1 读取变量

load('file_name');

或:

load file_name;

读取 file_name.mat 并恢复变量。

5.2 读取部分变量

load file_name var1 var2;

5.3 从文本文件读取

load file_name.txt;

或:

var = load('file_name.txt');

选项:

mat
-ascii

6. Cell Arrays 元胞数组

PPT 说明:

A cell is the most general data object in MATLAB.

cell array 是 MATLAB 中最通用的数据对象之一。

它可以存储不同类型、不同大小的数据。

例:

C = {1, 'hello', [1 2 3]; magic(3), true, @sin};

访问:

C(1,2) % 返回 cell
C{1,2} % 返回 cell 中的内容

7. Graphical representation of data 数据图形表示

PPT 展示了多种图形:

  • 3D Bar
  • Contour
  • Line
  • Rose
  • Pie
  • Bar and Stacked Bar
  • Multiple Overlays

8. What defines a pleasing plot?

一个好的图应具有客观标准:

  1. 有带单位的 labels。
  2. 用最少必要信息表达目标。
  3. 不要重复标注,除非必要。
  4. 避免不必要 callouts。
  5. 避免过度 eye candy。
  6. 测量数据用 scatter plots。
  7. 拟合或解析函数用 line plots。
  8. 自变量 domain 分辨率足够。
  9. 线宽、点大小、文字大小足够阅读。

9. Pleasing plots 示例

9.1 连续函数

例:

y = sin(x)

不好的图:

  • label 太小
  • linewidth 太小
  • 不必要使用颜色
  • 坐标轴文字看不清
  • 图上下没有 breathing room

好的图会改善这些问题。

9.2 离散测量数据

不好的图:

  • 没有 data labels
  • linewidth 太小
  • x/y 轴文字太小
  • 不必要的边框
  • 实验数据一般应使用 scatter plots

10. 示例:较好离散数据图代码

x = [10 25 52 72 95 110 150];
y = [15 17 18 21 25 28 30];
p1 = plot(x,y,'ko');
set(p1,'MarkerFaceColor','k')
set(p1,'MarkerSize',8)
axis([0 1.2*max(x) 0.9*min(y) 1.1*max(y)])
set(gca,'FontSize',20)
xlabel('Time (s)')
ylabel('\DeltaT (\circC)')
xfit = 0.9*min(x):.1:1.1*max(x);
fitComp = polyfit(x,y,1);
yfit = fitComp(1)*xfit + fitComp(2);
hold on
p2 = plot(xfit,yfit,'k-');
set(p2,'LineWidth',2)
hold off
lg = legend('Measured','Linear Fit');
set(lg,'Location','NorthWest')
legend boxoff
set(gcf,'Color','w')
set(gca, 'box', 'off')

补充解释:

  • polyfit(x,y,1):一次线性拟合。
  • fitComp(1) 是斜率。
  • fitComp(2) 是截距。
  • hold on 表示保留当前图继续画。
  • gca:当前坐标轴。
  • gcf:当前图窗。

11. Basic 2D plot commands

最常用的 2D 绘图命令:

plot(x,y)
scatter(x,y)

例:

x = -2*pi:pi/20:2*pi;
y = sin(x);
plot(x,y)
scatter(x,y)

要求:

  • xy 必须是长度相同的向量。
  • plot 默认蓝色线。
  • scatter 默认蓝色圆点。

12. plot 画直线

可以通过起点和终点画直线:

plot([0 20],[-5 5],'r--')

含义:

  • x 从 0 到 20
  • y 从 -5 到 5
  • 红色虚线

13. Other 2D plot commands

13.1 双 y 轴

x = -2*pi:pi/20:2*pi;
y1 = sin(x);
y2 = cos(x);
plotyy(x,y1,x,y2)

补充:新 MATLAB 推荐 yyaxis

13.2 y 轴对数

x = 0:1:25;
y = exp(x);
semilogy(x,y,'LineWidth',4);

13.3 x 轴对数

x = 0:1:25;
y = log(x);
semilogx(x,y,'LineWidth',4);

注意:log(0)-Inf,实际使用时通常避免 x=0。

13.4 x 和 y 都对数

x = logspace(0,5,25);
y = x.^5;
loglog(x,y,'LineWidth',4)

13.5 Polar 极坐标

theta = 0:0.01:2*pi;
rho = sin(2*theta).*cos(2*theta);
polar(theta,rho)

新 MATLAB 中可用 polarplot

13.6 Error Bars 误差棒

x = 1:25;
y = randi(25,1,length(x));
y_err = 0.25*y;
errorbar(x,y,y_err)

14. ezplot

ezplot 可直接绘制表达式,无需手动创建 x/y 向量。

ezplot('1/x')

默认 domain:

-2π 到 2π

指定 domain:

ezplot('1/x',[0 2*pi])

补充:较新 MATLAB 推荐 fplot

15. fplot

fplot 会根据函数变化智能选择 x 点,适合快速变化函数。

比较:

x = 0:.05:0.5*pi;
y = sin(1./x);
plot(x,y)

和:

fplot('sin(1/x)', [0 0.5*pi]);

fplot 会在原点附近增加细节。

16. Plotting a vector

很多 2D plot 命令可以只传一个向量。

此时 x 值默认是索引位置。

r = logspace(0,3,25);
plot(r,'ko','MarkerFaceColor','k')

横轴是:

1,2,3,...

17. Specifying plot attributes

标准 plot 调用形式:

plot(x,y,'LineSpecifiers',...
'PropertyName',PropertyValue)

17.1 Line specifiers

包括:

  • line style:solid, dash, dot, dash-dot
  • line color:red, green, blue, cyan 等
  • marker:plus, circle, asterisk 等

17.2 常见 property names

| Property | 含义 | | — | | | LineWidth | 线宽 | | MarkerSize | 点大小 | | MarkerEdgeColor | marker 边缘颜色 | | MarkerFaceColor | marker 填充颜色 |

18. Marker 和 line style 示例

x = -2*pi:pi/20:2*pi;
y = sin(x);

18.1 红色圆圈

plot(x,y,'ro')

18.2 红色圆圈加连线

plot(x,y,'ro-')

18.3 黑色圆圈加连线

plot(x,y,'ko-')

18.4 绿色点

plot(x,y,'g.')

18.5 洋红虚线加圆圈

plot(x,y,'m--o')

18.6 黑色线,10 pt 宽

plot(x,y,'k-','LineWidth',10)

18.7 绿色填充、红色边、2 pt 边宽

plot(x,y,'o','MarkerFaceColor','g',...
'MarkerEdgeColor','r','LineWidth',2)

19. MATLAB 预定义颜色

符号颜色
rRed
gGreen
bBlue
cCyan
mMagenta
yYellow
kBlack
wWhite

19.1 RGB 自定义颜色

普通 RGB 常为 0–255。 MATLAB 要求 0–1。

例如 RGB:

[1 37 110]

MATLAB 中写:

[1 37 110]./255

20. 查看 line specifications

方法:

  1. MATLAB documentation 搜索 linespec
  2. Plot options bar 中 View / Property Editor
  3. View / Property Editor / More Properties

21. Overlaid plots 多图叠加

21.1 一次 plot 多组数据

x = -2*pi:pi/20:2*pi;
y1 = sin(x);
y2 = cos(x);
plot(x,y1,x,y2,'LineWidth',4)

注意:

  • 每组数据都要指定 x。
  • MATLAB 自动选择颜色。
  • LineWidth 会作用于所有数据序列。

21.2 每组指定颜色

plot(x,y1,'r-',x,y2,'y-','LineWidth',4)

线宽仍应用于所有序列。

21.3 使用 hold on / hold off

x = -2*pi:pi/20:2*pi;
y1 = sin(x);
y2 = cos(x);
plot(x,y1,'r-','LineWidth',5)
hold on
plot(x,y2,'b-','LineWidth',5)
hold off
  • hold on:后续绘图加到当前 axes 上。
  • hold off:后续绘图会覆盖当前 axes。

22. gca / gcf / set

22.1 当前坐标轴和当前图窗

gca

get current axes

gcf

get current figure

22.2 set 命令

通用形式:

set(<ref to handle>, <property name>, <property value>)

例:

set(gca,'FontSize',20)

设置当前坐标轴字体大小为 20。

23. 设置图属性示例

x = 0:pi/20:2*pi;
y = sin(x);
plot(x,y,'LineWidth',3)
set(gca,'FontSize',20)
set(gcf,'Color','w')

含义:

  • 线宽 3
  • 坐标轴字体 20
  • 图窗背景白色

24. Plot parent / child hierarchy

MATLAB 图形对象有父子层级。

figure
└── axes
└── data set / plot object
  • axes 是 figure 的 child。
  • 一个 figure 可以有多个 axes。
  • data set 是 axes 的 child。

24.1 自动创建

调用:

plot()

MATLAB 会自动创建:

  • figure
  • axes
  • plot data

调用:

axes()

MATLAB 会创建 figure 来容纳 axes。

可以在命令行试:

axes
figure

25. Plotting multiple figures

如果连续两次 plot,第二次默认覆盖第一次。

要新建图窗:

x = -2*pi:pi/20:2*pi;
y1 = sin(x);
y2 = cos(x);
plot(x,y1,'k-','LineWidth',5)
figure
plot(x,y2,'k-','LineWidth',5)

25.1 指定 figure 编号

figure(3)

25.2 关闭图窗

命令作用
close关闭最后一个图窗
close(n)关闭编号 n 的图窗
close all关闭所有图窗

26. Multiple axes on a figure

一个 figure 中可以有多个 axes。

26.1 subplot

subplot(2,3,2)

含义:

  • 2 行
  • 3 列
  • 当前选择第 2 个位置

位置按行计数。

26.2 subplot 示例

x = 0:pi/20:2*pi;
y1 = sin(x-0);
y2 = sin(x-.5);
y3 = sin(x-1);
y4 = sin(x-1.5);
y5 = sin(x-2);
y6 = sin(x-2.5);
subplot(2,3,1)
plot(x,y1)
axis tight
subplot(2,3,2)
plot(x,y2)
axis tight
subplot(2,3,3)
plot(x,y3)
axis tight
subplot(2,3,4)
plot(x,y4)
axis tight
subplot(2,3,5)
plot(x,y5)
axis tight
subplot(2,3,6)
plot(x,y6)
axis tight

27. axes 指定位置

可以直接用 axes 指定坐标轴位置:

axes('Position',[.1 .1 .5 .3])
plot(x,y1)
axes('Position',[.5 .5 .2 .4])
plot(x,y3)

Position 是四元素向量:

[left bottom width height]

单位为整个 figure 窗口的比例,从 0 到 1。

28. 指定 domain 和 range

MATLAB 通常自动选择坐标范围,但也可以指定。

28.1 axis

plot(x,y1,'LineWidth',5)
axis([0 1.5*pi 0 1.5])
set(gca,'FontSize',20)

格式:

axis([xmin xmax ymin ymax])

28.2 xlim / ylim

plot(x,y1,'LineWidth',5)
xlim([0 1.5])
ylim([-1 1])
set(gca,'FontSize',20)

29. axis 预定义操作

命令作用
axis auto自动范围
axis tight紧贴数据
axis equalx/y 单位长度相同
axis square坐标轴区域为正方形
axis off隐藏坐标轴
axis ij反转 y 轴方向,常用于图像

30. Labeling and titling axes

plot(x,y1,'LineWidth',5)
set(gca,'FontSize',20)
xlabel('Time (s)')
ylabel('Voltage (V)')
title('Generator Output')
axis([0 2*pi -1.2 1.2])

坐标轴标签应包含单位。

31. Adding a legend

x = -2*pi:pi/20:2*pi;
y1 = sin(x);
y2 = cos(x);
plot(x,y1,'Color',...
[1 37 110]./255,...
'LineWidth',5);
hold on
plot(x,y2,'Color',...
[149 0 26]./255,...
'LineWidth',5);
hold off
axis tight
legend('sin(x)','cos(x)',...
'Location','NorthEast')

32. Placing text on a plot

x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y)
set(gca,'FontSize',20)
text(pi,0.2,'Text string','Color','b')

也可以用菜单:

Insert / textBox

3D 绘图

33. plot3

语法:

plot3(x, y, z, 'line specifiers', ...
'PropertyName', PropertyValue)

参数:

  • x,y,z:点坐标向量
  • line specifiers:线型和颜色
  • PropertyName / PropertyValue:其他属性

34. 3D plotting vectors

34.1 使用 plot3

t = 0:pi/100:2*pi;
x = sin(t);
y = cos(t);
z = t;
plot3(x,y,z,'LineWidth',4)
set(gca,'FontSize',16)
xlabel('x')
ylabel('y')
zlabel('z')

这会画出类似螺旋线的三维曲线。

34.2 使用 ezplot3

h = ezplot3('sin(t)',...
'cos(t)','t',[0 2*pi]);
set(gca,'FontSize',16)
set(h,'LineWidth',5)

35. Mesh and Surface Plots

35.1 mesh 和 surf

命令含义
mesh用线连接点
surf用彩色面表示区域

适合函数:

z = f(x,y)

35.2 三步法

  1. 在 x-y 平面创建网格。
  2. 计算每个网格点上的 z。
  3. 绘制 mesh 或 surface。

36. Step 1:Make the Grid

[X, Y] = meshgrid(x, y);

其中:

  • x,y:定义网格 domain 的向量。
  • X,Y:分别存储 x 和 y 坐标的矩阵。

37. Step 2:Find z Values

进行 element-by-element calculation。

例:

Z = sin(X).*cos(Y);

必须用:

.*
./
.^

保证逐元素计算。

38. Step 3:Draw the Plot

mesh(X, Y, Z)

或:

surf(X, Y, Z)

39. Other 3D Plots

包括:

  • Sphere
  • Cylinder
  • 3D bar
  • 3D stem
  • 3D scatter
  • 3D pie

40. Controlling the View in 3D

view(az, el)

或:

view([az, el])

参数:

  • az:azimuth,相对负 y 轴的方位角,默认 -37.5°
  • el:elevation,相对 x-y 平面的仰角,默认 30°

41. Example:Heat Conduction on a Plate

问题:

  • 矩形板:
    • a = 5 m
    • b = 4 m
  • 三边保持 0°C
  • 第四边保持 80°C
  • 绘制温度分布:
T(x,y)

41.1 二维热方程

稳态热传导通常满足 Laplace 方程:

∂²T/∂x² + ∂²T/∂y² = 0

边界条件:

  • 三边 0°C
  • 一边 80°C

41.2 步骤

  1. 创建 x 和 y domain 网格:
    • 宽度 a 分为 20 段
    • 宽度 b 分为 16 段
  2. 计算每个点温度。
  3. 绘制结果。

补充:对于一边恒温、三边零温的矩形板,解析解常用 Fourier 级数形式。根据高温边的位置不同,公式形式会改变。典型形式之一为:

T(x,y)=Σ B_n sinh(nπy/a) sin(nπx/a)

课程重点通常是:生成网格、计算 T 矩阵、用 meshsurf 绘图。

42. Example:Electric Field of Two Point Charges

问题:

两个带电粒子:

q1 = 2×10^-10
q2 = 3×10^-10

按图示位置放置。 计算并绘制电势 electric potential。

文件:

Ex16_3.m

42.1 电势公式补充

单个点电荷产生的电势:

V = k q / r

其中:

  • k = 1/(4πε0),约 8.99×10^9
  • q:电荷量
  • r:到电荷的距离

两个点电荷的总电势:

V = k*q1/r1 + k*q2/r2

如果电荷位置分别为 (x1,y1)(x2,y2)

r1 = sqrt((X-x1).^2 + (Y-y1).^2);
r2 = sqrt((X-x2).^2 + (Y-y2).^2);
V = k*q1./r1 + k*q2./r2;

注意避免 r=0 导致除零。

MATLAB Graphics System 图形系统

43. Properties of Objects

图形对象属性控制对象:

  • 外观
  • 行为

每个属性有:

  • property name
  • property value

对象创建时会应用默认值,但可以覆盖。

例:

hnd1 = plot(x, y, 'LineWidth', 2);

getset 可以读取 / 修改已有对象属性。

44. Graphics handles 图形句柄

Figures、axes、plots 都可以赋予 handles。

句柄类似变量,但实际上是指向图形对象的 pointer。

例:

myHandle1 = plot(x,y);
myFig = figure;
h = axes;
foo = axes;

45. set command

用句柄设置属性:

set(<handle>, <property>, <propertyValue>)

例:

pl1 = plot(x,y);
set(pl1,'LineWidth',2)

46. get command

读取句柄属性:

get(<handle>, <property>)

例:

fig1 = figure;
pl1 = plot(x,y);
get(fig1,'Position')

注意:PPT 中引号可能显示成弯引号 ‘Position',实际 MATLAB 代码应使用普通单引号:

'Position'

47. 图形句柄示例

% Example handle graphics use
x = 0:pi/100:2*pi;
y = sin(x);
myFigure = figure;
plot(x,y)
% Set the background of the figure to white
set(myFigure,'Color','w')
% Take the default plot position and reduce the width by 1/2
pos = get(myFigure,'Position');
pos(3) = 0.5*pos(3);
set(myFigure,'Position',pos);

解释:

  • Position 通常是 [left bottom width height]
  • pos(3) 是 width
  • 代码把图窗宽度减半

48. Example:Customizing a Plot

要求:

绘制函数,范围:

-3π ≤ x ≤ 3π

然后:

  • 背景设为粉色
  • 只显示 y-axis grid lines
  • 线改为橙色,宽度 2 points

49. Example:Selecting Objects

写程序:

  • 显示 plot 中被选对象的信息
  • 直到按键结束

文件:

Ex17-2

50. Example:Positioning Objects

程序创建一个 figure,其中有两个重叠 axes。

  • 第一个 axes:文本注释 attached to the line itself
  • 第二个 axes:文本注释放在左下角

51. Example:Animating Plots

精细控制 plotting 可以实现动画。

52. Animating figures:2D shifting sine wave

x = 0:pi/100:2*pi;
y = sin(x);
p1 = plot(x,y,'k-','LineWidth',3);
axis tight
for jj = 1:100
pause(0.01)
y = sin(x+jj*pi/100);
set(p1,'XData',x,'YData',y)
end

原理:

  • pause(0.01) 暂停一小段时间。
  • set(p1,'XData',...,'YData',...) 更新已有曲线数据。
  • 不断更新就形成动画。

53. Animating figures:3D shifting trigonometric field

x = linspace(-2*pi,2*pi,100);
y = x;
[X,Y] = meshgrid(x,y);
Z = sin(X)+cos(Y);
h = surface(Z);
shading interp
axis off
set(gcf,'Color','w')
for jj = 1:100
pause(0.05)
Z = sin(X+jj*pi/100) + cos(Y+jj*pi/100);
set(h,'CData',Z)
end

解释:

  • surface(Z) 创建曲面对象。
  • shading interp 平滑颜色插值。
  • axis off 隐藏坐标轴。
  • 更新 CData 改变颜色数据,形成动画。

常见 MATLAB 语法总表

1. 基础符号

符号含义
;抑制输出 / 分隔矩阵行
,分隔元素或语句
[]创建普通数组
{}创建 / 访问 cell 内容
()索引或函数参数
:范围、所有元素
'转置;也用于字符串单引号
%注释

2. 数组与矩阵运算区别

操作矩阵运算逐元素运算
A*BA.*B
A/BA\BA./B
A^2A.^2

初学者最常见错误:忘记加点。

3. 绘图常用命令

命令作用
plot2D 线图
scatter散点图
plot33D 线图
mesh网格图
surf曲面图
subplot一个 figure 多个 axes
figure新建图窗
hold on/off保留 / 关闭叠加
xlabel/ylabel/zlabel坐标轴标签
title标题
legend图例
axis坐标范围 / 坐标样式
xlim/ylimx/y 范围
text图中添加文字

4. 文件输入输出

命令作用
input从用户读取输入
disp简单显示
fprintf格式化输出
save保存变量
load读取变量

5. 控制流

结构语法
forfor i = ...; ...; end
whilewhile condition; ...; end
ifif condition; ...; end
if-elseif ...; elseif ...; else ...; end

6. 逻辑与索引

类型示例
关系运算x > 3
逻辑与a && bA & B
逻辑或`a
逻辑非~a
逻辑索引x(x>3)

最后复习建议

  1. MATLAB 下标从 1 开始。
  2. 数组逐元素运算一定记住点:
    • .*
    • ./
    • .^
  3. 解线性方程优先用:
    x = A\b;
  4. 函数有自己的 workspace,脚本没有。
  5. 画图时一定写:
    xlabel
    ylabel
    title
    legend
  6. 实验数据常用 scatter,解析函数常用 line plot。
  7. 对大型、很多 0 的矩阵,用 sparse。
  8. 浮点数不是绝对精确的,比较小数时不要盲目用 ==
  9. 遇到不会的函数,马上用:
    help 函数名
    doc 函数名
    lookfor 关键词
作者信息:老官童鞋gogo
发表于:2026年05月27日
本文标题: MATLAB基础语法