NOTE
下面的内容主要来自于上课 PPT + AI 生成
Lec 1:MATLAB 入门、数组、数值精度
1. 课程基本信息
1.1 课程名称
Introduction to Scientific Computing 科学计算导论
本课程围绕 MATLAB 展开,学习科学计算中常用的编程、矩阵运算、可视化、数值方法和工程应用。
2. Course outline & schedule 课程安排
| 周次 | 内容 |
|---|---|
| Week 1 | Lec 1:Course Introduction, Machine Model, Intro to MATLAB, Built-in functions, Arrays, Linear algebra, Interfacing with MATLAB, Numerical accuracy |
| Week 2 | Lec 2:Functions, Arrays, Operations on Arrays, Loops, If-else-end |
| Week 3 | Lec 3:Arrays, Array Operations, Logical array, Matrix, Matrix operations |
| Week 4 | Lec 4:File Input/Output, 2D & 3D Plotting |
| Week 5 | Lec 5:Differentiation & Integration, Dynamical and Stochastic Systems, ODE & Random Numbers |
| Week 6 | Lec 6:Polynomials, Curve Fitting & Interpolation, Probability and Statistics, Root Finding & Optimization |
| Week 7 | Lec 7:Combinatorial Optimizations, Shortest Path Problems & Sorting, Matrix Computation, Over-constrained Systems, Least Squares Method |
| Week 8 | Lec 8:Image Processing, Symbolic Math, GUI |
| Week 9 | Final 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?
本课程涉及三个方面:
- About computer programming
编程语言就是给计算机的指令。
MATLAB 是:
- 一种高级编程语言
- 一个专门用于工程和科学计算的计算系统
- 特别适合:
- 数值计算
- 数据分析
- 可视化
- About scientific computing
科学计算关注:
- 解决科学问题的基本技术
- 解决科学问题的策略
- 应用领域:
- 科学
- 工程
- 经济学
- 其他很多学科
- 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 project | 30% |
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 科学计算
科学家和工程师会:
- 建立物理问题的数学模型
- 计算数学模型的解
- 求解非线性方程
- 求解优化问题
- 求解微分方程,以理解真实世界如何动态变化
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 从高级代码到硬件
程序执行的大致层次:
ApplicationsHigh level codeAssembly / machine codeVoltagesMicroprocessorIndividual 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);endavgVal = 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 = 5MATLAB 会在命令窗口显示:
a = 518. 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 创建脚本
命令行:
edit filename.m22.3 运行脚本
如果文件名是 filename.m,运行:
filename也可以按 F5 或点击 Run。
22.4 脚本作用域
脚本可以从:
- 当前目录 current directory
- MATLAB search path
中被找到并运行。
23. Current working directory 当前工作目录
MATLAB 有一个当前工作目录。
建议:
- 创建一个专门放课程代码的文件夹。
- 在 MATLAB 中把当前工作目录设置到那里。
- MATLAB 会优先在当前目录查找脚本和函数。
24. Linear algebra primer 线性代数入门
线性方程组可以写成:
A * X = B其中:
A是系数矩阵X是未知向量B是右端项
理论上:
X = A^(-1) BMATLAB 中一般用:
X = A\B;比显式 inv(A)*B 更推荐。
25. 打开、运行、中断 M-file
25.1 新建 / 打开脚本
edit newScript25.2 执行脚本
- F5
- 命令窗口输入脚本名
- 工具栏 Run
25.3 中断程序
如果程序死循环或运行太久:
Ctrl + C26. 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 无符号整数最大是:
25527. Overflow 溢出
内存位置大小固定,因此能表示的数值范围有限。
例:
X = uint8(78);Y = uint8(190);Z = X + Y;理论上:
78 + 190 = 268但 uint8 最大只能表示 255,因此结果会被截断 / 饱和到 255。
27.1 常见无符号整数范围
| 类型 | 范围 |
|---|---|
| 8 bit unsigned | 0–255 |
| 16 bit unsigned | 0–65535 |
| 32 bit unsigned | 0–约 4 billion,即 2^32 - 1 |
28. Floating point 浮点数
科学计算中不仅有整数,还有:
- 有理数,例如
0.335,-27.890 - 无理数,例如
pi和e
计算机通常用有限精度近似表示它们。
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 analysts31. 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 |
例:
clearclcwhosLec 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 valuesvar1 = 2*a;var2 = b^2;var3 = sqrt(c);
% Calculating the outputd = var1 + var2 + var3;特点:
- 第一行以
function开头 - 输入:
a,b,c - 输出:
d - 函数内部变量不会自动出现在外部 workspace
2.2 Script 示例
% Define values of scalars a, b, and ca = 1;b = 2;c = 15;
% Modifying the scalar values a, b, and cvar1 = 2*a;var2 = b^2;var3 = sqrt(c);
% Calculating the sum of the modified scalar valuesd = 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.m8. Newton’s Method 牛顿法求平方根
目标:只用 + - * / 求给定数 a 的平方根。
考虑函数:
y(x) = x^2 - a平方根对应:
x^2 - a = 0即求这个函数的根。
8.1 牛顿法思想
在当前点 x:
- 用切线近似函数
- 求切线与 x 轴交点
- 用交点作为新的 x
- 重复直到足够接近
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. 如何调用函数?
可以:
- 从 command line 调用,必须包含 inputs。
- 从其他函数调用。
例:
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 testFunction11. 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. 函数调用时发生什么?
- 实参 arguments 被复制到输入参数 input parameters。
- 函数体在自己的 private workspace 中运行。
- 函数不能看见调用环境中的变量。
- 函数结束时,输出参数被复制回调用环境。
- MATLAB 通过 search path 查找函数:
- 当前目录优先
- 然后搜索路径中的其他目录
13. Search paths 搜索路径
MATLAB 调用函数 / 脚本时,会搜索一系列文件夹,即 search path。
包含:
- current working folder
- MATLAB 安装时自带 toolbox 文件夹
- 用户添加的路径
13.1 查看路径
path13.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 y15.2 清空命令窗口
clc15.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.m18. Example 2:Evaluating an Expression
要求写一个函数文件计算某表达式,并允许 x 是向量。
计算:
f(x)forx = 6f(x)forx = 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.m23. Function Functions
MATLAB 内置函数 fzero 可找函数零点:
f(x) = 0问题:如何把函数 f(x) 描述给 fzero?
两种方式:
- Function handle
- Function name string
24. Function Handles 函数句柄
函数句柄是一种数据类型,保存和函数相关的唯一值。
24.1 获得方式
@function_name@cos@FtoC如果 FtoC 是匿名函数,则直接用变量名 FtoC。
例:
f = @cos;f(0)文件:
funplot.mFdemo.m25. Function Names in Strings
较老方法,效率较低。
传入函数名字符串:
'cos''FtoC'用 feval 执行:
var = feval('function_name', arguments);文件:
funplotS.m26. 解决真实问题的策略
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^a 到 10^b 按对数均匀取 n 个点。
28. 访问向量元素
假设:
x = [5, 9, 4, 1, 7, 3, 4, 8];28.1 第一个元素
y = x(1);结果:
y = 528.2 范围索引
y = x(1:3);结果:
[5 9 4]y = x(6:8);结果:
[3 4 8]28.3 最后一个元素
y = x(end);结果:
828.4 偏移索引
y = x(1+4);即 x(5),结果:
728.5 倒数第三个元素
y = x(end-2);结果:
328.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 1931.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]) endend每一个 for 都需要一个 end。
32. Relational operators 关系运算符
关系运算符比较数值并返回 true 或 false。
MATLAB 中:
- true 表示
1 - false 表示
0
| 运算符 | 含义 |
|---|---|
< | 小于 |
<= | 小于等于 |
== | 等于 |
~= | 不等于 |
> | 大于 |
>= | 大于等于 |
注意:
=是赋值。
==才是判断相等。
33. while loops
33.1 基本语法
while <relationalExpression> <expressionToEvaluate>endPPT 中 End 应为 MATLAB 语法 end,大小写一般 MATLAB 可接受,但习惯小写。
33.2 简单例子
a = 1;while a < 10 a = a + 1;end循环结束时:
a = 10while 循环适合不知道迭代次数的情况。
34. for 和 while 实现 n 次迭代
34.1 for loop 牛顿法
n = 100;a = 2;x = a/2;
for ii = 1:n x = (x + a/x)/2;end34.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.^2a.*afor 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 statementsend例:
a = 1;
if a == 1 disp('a is equal to 1! Yay!')end37. 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!']) endend38. 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!'])end39. if / elseif / else
当有多个条件时:
if condition1 statements1elseif condition2 statements2else statements3endPPT 例子提到 FEM shape function。
40. Logical operators 完整表
| 标量 | 向量 | 函数形式 | 含义 |
|---|---|---|---|
&& | & | and(a,b) | And |
| ` | ` | ` | |
xor(a,b) | Or exclusive | ||
~ | ~ | not(a) | Not / complement |
40.1 or 与 xor 真值表
| a | b | or(a,b) | xor(a,b) |
|---|---|---|---|
| F | F | F | F |
| F | T | T | T |
| T | F | T | T |
| T | T | T | F |
区别:
or:只要至少一个真就真。xor:只有一个真时才真,两个都真反而是假。
41. Logical NOT
NOT 只需要一个输入,返回逻辑相反值。
not(0) % 1~0 % 1not(1) % 0not(3) % 0非零值在逻辑中都视为 true。
42. Logical scalars 逻辑标量
例:
a = 3 > 2; % 1a = 2 > 3; % 0a = 2 >= 2; % 1a = 2 ~= 2; % 0a = 2 == 2; % 1a = ~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]规则:
v必须是 logical 类型。- 返回
x中对应v为 true 的元素。 x和v必须大小相同。
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; endend
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 的整数
算法:
- 列出从 2 到 n 的数。
- 当前列表第一个数一定是质数,把它加入质数列表。
- 划掉该数的所有倍数。
- 重复步骤 2–4,直到当前质数大于等于
sqrt(n)。 - 剩余所有数都是质数。
该算法使用:
- logical expressions
- logical indexing
Lec 3:矩阵、多维数组、矩阵运算、稀疏矩阵、数组函数
1. What is a matrix?
矩阵是二维数组,由:
- rows 行
- columns 列
组成。
例如一个 3 行 3 列矩阵大小为:
3 x 32. Multidimensional Array / Matrix
数据类型可从低维到高维理解:
| 类型 | 含义 | | - | | | Scalar | 标量,一个数 | | Vector | 向量,一维数组 | | Matrix / Array | 矩阵 / 二维数组 | | Multidimensional Matrix / Array | 多维数组 |
三维数组可以理解为多个二维矩阵沿第三维堆叠。
3. Basic Array-related Operators
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 <= n 且 k+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 34 5 65.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 42 53 67. 使用表达式初始化数组
数组初始化表达式可以包含:
- 算术运算
- 已定义数组的全部或部分
例:
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 72 5 83 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)结果:
910.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 00 2 00 0 312.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 字符串相关函数
例如:
lowerisspaceisletter15. Matrix Math 矩阵数学
内容包括:
- addition / subtraction
- multiplication
- division
- array math
- array operations
16. Array addition and subtraction
规则:
- 标量可以加到任意数组,标量会加到每个元素。
- 数组之间加减必须维度相同,对应位置逐元素加减。
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 agreeB = 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 3B: 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 = A20.2 Inverse matrix 逆矩阵
如果:
BA = AB = I则 B 是 A 的逆矩阵。
MATLAB:
inv(A)A^-1注意:
- A 必须是方阵
- A 必须可逆
21. Left division 左除
求:
AX = B理论:
X = A^(-1)BMATLAB 推荐:
X = A\B;不要优先使用:
X = inv(A)*B;因为 A\B 更快更稳定。
22. Right division 右除
求:
XC = D理论:
X = D C^(-1)MATLAB:
X = D/C;文件:
L9.m23. Gaussian Elimination 高斯消元
可用于解线性方程组:
AX = B或:
XC = D文件:
L9.m24. 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 tightcolormap('gray')shading interp26. flipdim
rot90、fliplr、flipud 要求二维矩阵。
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) | 单位矩阵 |
rand | 0 到 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)结果:
8numel(A)结果:
1630. 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) = 18y(:,:,2) = 634. 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.m2. Output Commands 输出命令
2.1 disp
disp(variable)disp('text to print')用于简单显示变量或文本。
2.2 fprintf
fprintf(format,data)功能:
- 格式化输出到屏幕
- 或保存到文件
- 选项很多,参考 Help
fprintf 比 disp 更灵活,可控制:
- 小数位
- 换行
- 字符串格式
- 对齐方式
这是以后学习 C 语言时也会见到的概念。
3. Files in MATLAB
3.1 文件本质
文件在硬盘上以 bytes 序列存储。
文件格式用于解释内容,有时由后缀表示:
.txt.m.mat.doc.ppt3.2 文件系统
文件存储在 File System 中,可以用目录结构组织信息。
3.3 MATLAB 文件
Scripts 和 functions 存储在 .m 文件中。
.m 文件本质是简单文本文件,可用 MATLAB Editor 编辑。
3.4 保存和读取变量
MATLAB session 中的变量可用:
saveload保存和读取。
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-ascii6. 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) % 返回 cellC{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?
一个好的图应具有客观标准:
- 有带单位的 labels。
- 用最少必要信息表达目标。
- 不要重复标注,除非必要。
- 避免不必要 callouts。
- 避免过度 eye candy。
- 测量数据用 scatter plots。
- 拟合或解析函数用 line plots。
- 自变量 domain 分辨率足够。
- 线宽、点大小、文字大小足够阅读。
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 onp2 = 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)要求:
x和y必须是长度相同的向量。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 预定义颜色
| 符号 | 颜色 |
|---|---|
r | Red |
g | Green |
b | Blue |
c | Cyan |
m | Magenta |
y | Yellow |
k | Black |
w | White |
19.1 RGB 自定义颜色
普通 RGB 常为 0–255。 MATLAB 要求 0–1。
例如 RGB:
[1 37 110]MATLAB 中写:
[1 37 110]./25520. 查看 line specifications
方法:
- MATLAB documentation 搜索
linespec - Plot options bar 中 View / Property Editor
- 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 onplot(x,y2,'b-','LineWidth',5)hold offhold on:后续绘图加到当前 axes 上。hold off:后续绘图会覆盖当前 axes。
22. gca / gcf / set
22.1 当前坐标轴和当前图窗
gcaget current axes
gcfget 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。
可以在命令行试:
axesfigure25. Plotting multiple figures
如果连续两次 plot,第二次默认覆盖第一次。
要新建图窗:
x = -2*pi:pi/20:2*pi;y1 = sin(x);y2 = cos(x);
plot(x,y1,'k-','LineWidth',5)
figureplot(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 tight27. 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 equal | x/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 / textBox3D 绘图
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 三步法
- 在 x-y 平面创建网格。
- 计算每个网格点上的 z。
- 绘制 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 mb = 4 m
- 三边保持
0°C - 第四边保持
80°C - 绘制温度分布:
T(x,y)41.1 二维热方程
稳态热传导通常满足 Laplace 方程:
∂²T/∂x² + ∂²T/∂y² = 0边界条件:
- 三边 0°C
- 一边 80°C
41.2 步骤
- 创建 x 和 y domain 网格:
- 宽度 a 分为 20 段
- 宽度 b 分为 16 段
- 计算每个点温度。
- 绘制结果。
补充:对于一边恒温、三边零温的矩形板,解析解常用 Fourier 级数形式。根据高温边的位置不同,公式形式会改变。典型形式之一为:
T(x,y)=Σ B_n sinh(nπy/a) sin(nπx/a)课程重点通常是:生成网格、计算 T 矩阵、用
mesh或surf绘图。
42. Example:Electric Field of Two Point Charges
问题:
两个带电粒子:
q1 = 2×10^-10q2 = 3×10^-10按图示位置放置。 计算并绘制电势 electric potential。
文件:
Ex16_3.m42.1 电势公式补充
单个点电荷产生的电势:
V = k q / r其中:
k = 1/(4πε0),约8.99×10^9q:电荷量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);用 get 和 set 可以读取 / 修改已有对象属性。
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 whiteset(myFigure,'Color','w')
% Take the default plot position and reduce the width by 1/2pos = 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-250. 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 interpaxis offset(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*B | A.*B |
| 除 | A/B 或 A\B | A./B |
| 幂 | A^2 | A.^2 |
初学者最常见错误:忘记加点。
3. 绘图常用命令
| 命令 | 作用 |
|---|---|
plot | 2D 线图 |
scatter | 散点图 |
plot3 | 3D 线图 |
mesh | 网格图 |
surf | 曲面图 |
subplot | 一个 figure 多个 axes |
figure | 新建图窗 |
hold on/off | 保留 / 关闭叠加 |
xlabel/ylabel/zlabel | 坐标轴标签 |
title | 标题 |
legend | 图例 |
axis | 坐标范围 / 坐标样式 |
xlim/ylim | x/y 范围 |
text | 图中添加文字 |
4. 文件输入输出
| 命令 | 作用 |
|---|---|
input | 从用户读取输入 |
disp | 简单显示 |
fprintf | 格式化输出 |
save | 保存变量 |
load | 读取变量 |
5. 控制流
| 结构 | 语法 |
|---|---|
| for | for i = ...; ...; end |
| while | while condition; ...; end |
| if | if condition; ...; end |
| if-else | if ...; elseif ...; else ...; end |
6. 逻辑与索引
| 类型 | 示例 |
|---|---|
| 关系运算 | x > 3 |
| 逻辑与 | a && b,A & B |
| 逻辑或 | `a |
| 逻辑非 | ~a |
| 逻辑索引 | x(x>3) |
最后复习建议
- MATLAB 下标从 1 开始。
- 数组逐元素运算一定记住点:
.*./.^
- 解线性方程优先用:
x = A\b;
- 函数有自己的 workspace,脚本没有。
- 画图时一定写:
xlabelylabeltitlelegend
- 实验数据常用 scatter,解析函数常用 line plot。
- 对大型、很多 0 的矩阵,用 sparse。
- 浮点数不是绝对精确的,比较小数时不要盲目用
==。 - 遇到不会的函数,马上用:
help 函数名doc 函数名lookfor 关键词