一、matlab可以做什么
MATLAB是一个让你"用数学逻辑和矩阵思维,通过编程来解决工程和科学问题"的交互式环境。
它既不是纯粹的编程语言(如C++),也不是纯粹的数学软件(如Mathematica),而是两者的结合体。
MATLAB这个名字本身就是Matrix Laboratory(矩阵实验室)的缩写。
-
这意味着什么? 在MATLAB眼里,万物皆矩阵 。一个数字是
1x1的矩阵,一行文字是1xN的字符矩阵,一张图片是一个MxNx3的颜色数据矩阵。 -
威力在哪? 在其他编程语言里,你要计算1000个数的正弦,得写一个循环(
for i=1:1000);在MATLAB里,你只需写sin(1:1000),它瞬间就能算完。这种"数组化/向量化"的运算能力,是它速度极快且代码极短的根本原因。
| 应用场景 | 通俗解释 | 现实中的例子 |
|---|---|---|
| 1. 数据清洗与可视化 | 把杂乱无章的实验数据(Excel表)读进来,去掉异常值,画出精美的二维、三维图,用于汇报或论文发表。 | 将一个月的气温传感器数据绘制成带阴影的折线图。 |
| 2. 数值计算与求解 | 解那些手算算不出来、公式推不出来的数学问题,比如解复杂的微分方程、求积分、求矩阵的特征值。 | 计算桥梁在风荷载下的受力变形。 |
| 3. 信号与图像处理 | 对声音、心电图、雷达回波、照片进行加工处理。 | 去除照片噪点、提取音频中的人声、检测X光片中的阴影。 |
| 4. 建模与仿真(Simulink) | 在电脑里搭建一个虚拟的"实验台",不砸坏东西就能测试。这是MATLAB的王牌功能。 | 汽车厂商在电脑里模拟ABS防抱死系统在雪地里的反应。 |
| 5. 机器学习与深度学习 | 利用现成的工具箱,用少量代码就能实现人脸识别、价格预测、数据分类。 | 根据历史销量预测未来3个月的备货量。 |
| 6. 算法开发与验证 | 在MATLAB里验证一个新算法的可行性,验证通过后,再转成C/C++代码烧录到嵌入式芯片里。 | 无人机飞控算法的原型设计。 |
| 对比维度 | MATLAB | Python(如NumPy/SciPy) |
|---|---|---|
| 出身 | 商业软件,由MathWorks公司维护,封闭但专业。 | 开源语言,由社区维护。 |
| 上手门槛 | 低。自带完整桌面环境,安装即用,所有工具箱协同工作。 | 高。需要自己安装Anaconda,管理各种库,版本兼容性有时令人抓狂。 |
| 文档质量 | 天花板级别 。官方帮助文档(doc命令)极其详尽,每个函数都有实例。 |
靠Stack Overflow和第三方博客,质量参差不齐。 |
| 工具箱生态 | 极其规范,工业界(汽车、军工、通信)深度依赖。 | 广度更大(AI、爬虫、Web),但在特定工程领域(如控制、DSP)不如MATLAB专业。 |
| 价格 | 昂贵(个人版几千元,企业版数万)。 | 完全免费。 |
MATLAB就是一个"高级的、带图形界面的、专门为工程师设计的巨型矩阵计算器"。
二、界面认识

三、快捷键
🚀 代码编辑与格式化
这部分是写代码时最常用的,能有效提高编码效率。
| 快捷键 (Windows) | 功能说明 |
|---|---|
Ctrl + I |
自动缩进/整理选中的代码,让代码结构更清晰。 |
Ctrl + R |
注释选中的代码行。 |
Ctrl + T |
取消注释选中的代码行。 |
Tab / Shift + Tab |
增加/减少选中代码的缩进。 |
Ctrl + Z / Ctrl + Y |
撤销 / 重做。 |
Ctrl + F / Ctrl + H |
查找 / 替换文本。 |
Ctrl + Space 或 Tab |
代码自动补全,输入函数或变量名前几个字母后使用,可查看提示和补全。 |
Ctrl + D |
跳转到光标所在函数或变量的定义处。 |
🔍 导航与窗口管理
快速在编辑器、命令行和各文件间切换。
| 快捷键 (Windows) | 功能说明 |
|---|---|
Ctrl + Tab |
在编辑器打开的文件标签页间切换。 |
Ctrl + G |
跳转到指定行,输入行号即可快速定位。 |
Ctrl + 0 |
将焦点切换到命令行窗口 (Command Window)。 |
Ctrl + Shift + 0 |
将焦点切换到编辑器 (Editor)。 |
Ctrl + W |
关闭当前打开的编辑器文件。 |
Ctrl + PgUp/PgDn |
在编辑器内向左/右切换文件标签页。 |
🐞 程序调试
掌握调试快捷键能让你高效地排查代码问题。
| 快捷键 (Windows) | 功能说明 |
|---|---|
F5 |
保存并运行当前脚本文件。 |
F9 |
执行选中的代码段,适合测试部分代码。 |
F10 |
单步执行,不进入函数内部。 |
F11 |
步入,当执行到函数调用时,进入函数内部。 |
Shift + F11 |
步出,执行完当前函数的剩余部分并返回。 |
F12 |
在当前行设置或清除断点。 |
Ctrl + C |
强制中断正在运行的程序。 |
🎯 命令行窗口 (Command Window) 专属
| 快捷键 (Windows) | 功能说明 |
|---|---|
↑ / ↓ |
调出上一条/下一条历史命令。 |
Ctrl + A / Ctrl + E |
光标跳转到当前行的开头/结尾。 |
Ctrl + U / Esc |
清除当前行的所有内容。 |
四、matlab基础知识
第一部分:清空环境(I 部分)
clear all % 清除Workspace中的所有变量
clc % 清除Command Window中的所有命令
-
✅
clc很好,清屏让界面干净。 -
⚠️ 但请把
clear all改成clear; close all;
| 命令 | 作用 | 为什么建议改? |
|---|---|---|
clear all |
清除所有变量、函数、断点、全局变量 | 太暴力了! 它会清除你加载的库和函数,拖慢速度。新手阶段用没关系,但养成习惯用 clear 就够了。 |
close all |
关闭所有打开的图形窗口 | 画图多了不关会卡,加上这句保险。 |
推荐写法:
clear; % 只清除变量
clc; % 清屏
close all; % 关闭所有图窗
第二部分:变量命名规则(II 部分)
运行后工作区会同时存在 A 和 a,证明区分大小写。
| 错误写法 | 原因 | 正确写法 |
|---|---|---|
2a = 5 |
不能以数字开头 | a2 = 5 |
my-var = 3 |
不能使用减号(会被当成运算符) | my_var = 3 或 myVar = 3 |
for = 10 |
不能使用MATLAB关键字(for, if, end等) |
for_val = 10 |
MATLAB命名惯例(非强制,但强烈建议):
-
变量名:小写驼峰,如
myData,signalLength -
常量:全大写,如
PI,GRAVITY -
避免用
i和j做变量名(它们默认是虚数单位)
第三部分:数据类型(III 部分)
1. 字符串(String)
s='a'
abs(s) % 输出 97(a的ASCII码)
char(65) % 输出 'A'
扩展一下 :MATLAB现在更推荐用双引号表示字符串(特别是2017a之后的版本):
s1 = 'a'; % 字符数组(老式)
s2 = "a"; % 字符串(新式,支持更多操作)
s3 = "Hello " + "World"; % 可以用 + 拼接字符串!
2. 矩阵(Matrix)
(1) 基本操作
A = [1 2 3; 4 5 2; 3 2 7]
B = A' % 转置(行列互换)
C = A(:) % 按列堆叠成列向量
A(:) 这个操作非常重要! 它把一个矩阵"拉直"成一列,相当于:
C = [1; 4; 3; 2; 5; 2; 3; 2; 7]
实战用途 :用 find(A(:) > 3) 可以快速找出所有大于3的元素位置。
(2) 求逆矩阵(inv)------ 重点注意!
D = inv(A)
A * D % 理论上应该得到单位矩阵(对角线上是1,其余是0)
| 情况 | 结果 | 怎么办? |
|---|---|---|
| 矩阵方阵且行列式非零 | 正常求出逆矩阵 | ✅ 用 inv |
| 矩阵不是方阵 | ❌ 报错 | 改用伪逆 pinv |
| 矩阵行列式为0(奇异矩阵) | ❌ 报错或结果失真 | 改用 A \ eye(size(A)) |
更推荐的求逆写法(数值稳定性更好):
% 不推荐
D = inv(A);
% 推荐(解线性方程组的思想,更稳定)
D = A \ eye(size(A));
(3) 高维数组(你写的 E 部分)
E = zeros(10, 5, 3) % 10行、5列、3页的零矩阵
E(:,:,1) = rand(10,5) % 第1页填随机数(0~1之间),均匀分布
E(:,:,3)=randn(10,5) % 标准正态分布
E(:,:,2) = randi([10,100], 10, 5) % 第2页填10~100的随机整数
补充一个小技巧:如果你想看第2页的数据,可以这样查看:
E(:,:,2) % 显示第2页所有数据
E(3, 4, 2) % 显示第2页第3行第4列的具体数值
whos
这会列出工作区所有变量的详细信息(大小、字节数、类型),是调试时的神器!
(4) 特殊矩阵
1. 单位矩阵 (Identity Matrix) - eye(n)
数学定义:
-
主对角线元素全为 1 ,非对角线元素全为 0 的方阵
-
记作

-
核心性质:对任何同阶矩阵 A,都有 A×I=I×A=AA×I=I×A=A(矩阵乘法的单位元)
示例:
matlab
I = eye(3)
输出:
text
I =
1 0 0
0 1 0
0 0 1
数学含义:
-
3阶单位矩阵 I3=1 0 0;0 1 0;0 0 1I
-
类比:数字乘法中的"1",任何数×1 = 本身
应用场景:
matlab
% 1. 验证矩阵求逆
A = [2, 1; 1, 1];
A * inv(A) % 结果应为 eye(2)
% 2. 初始化迭代算法
x_old = eye(10); % 初始猜测为单位矩阵
% 3. 构造相关系数矩阵
R = corrcoef(data);
R(eye(size(R))==1) = 1; % 确保对角线为1
% 4. 求解线性方程组 Ax = b 时构造增广矩阵
A_aug = [A, eye(size(A))];
2. 全1矩阵 (Matrix of Ones) - ones(n)
定义:所有元素都为1的矩阵,不一定是方阵
示例:
matlab
ones(3) % 3×3全1方阵
ones(2, 4) % 2行×4列全1矩阵
输出:
text
ans =
1 1 1
1 1 1
1 1 1
与单位矩阵的区别:
matlab
>> ones(3) >> eye(3)
ans = ans =
1 1 1 1 0 0
1 1 1 0 1 0
1 1 1 0 0 1
应用场景:
matlab
% 1. 累乘运算初始化
product = ones(1, n); % 累乘初始值设为1
% 2. 图像处理中的卷积核
kernel = ones(3, 3) / 9; % 3×3均值滤波核
% 3. 生成坐标网格
[X, Y] = meshgrid(1:5, 1:3);
Z = ones(size(X)); % 初始高度
% 4. 掩码操作
mask = ones(size(image)); % 全1掩码
3. 魔方矩阵 (Magic Square) - magic(n)
数学定义:
示例:
matlab
M = magic(3)
输出:
text
M =
8 1 6
3 5 7
4 9 2
验证:
-
行和:8+1+6=15, 3+5+7=15, 4+9+2=15
-
列和:8+3+4=15, 1+5+9=15, 6+7+2=15
-
对角线和:8+5+2=15, 6+5+4=15
更多例子:
matlab
magic(4) % 4×4魔方,魔方常数 = 4(16+1)/2 = 34
magic(5) % 5×5魔方,魔方常数 = 5(25+1)/2 = 65
应用场景:
matlab
% 1. 测试算法性能(有已知解的问题)
M = magic(5);
% 验证每行和相等
sum(M, 2) % 每行和都是65
% 2. 构造拉丁方阵
% 3. 图像置乱加密的初始排列
% 4. 组合数学中的实验设计
常用特殊矩阵汇总
| 函数 | 名称 | 特征 | 示例 |
|---|---|---|---|
eye(n) |
单位矩阵 | 对角线=1,其他=0 | eye(3) |
ones(n) |
全1矩阵 | 所有元素=1 | ones(3,4) |
zeros(n) |
零矩阵 | 所有元素=0 | zeros(2,3) |
magic(n) |
魔方矩阵 | 行列对角线和相等 | magic(5) |
rand(n) |
随机矩阵 | 0~1均匀分布 | rand(3) |
randn(n) |
标准正态随机矩阵 | 均值为0,方差为1 | randn(4) |
diag(v) |
对角矩阵 | 对角线上为向量v的元素 | diag([1,2,3]) |
第四部分 元胞数组和结构体
1.元胞数组 (Cell Array)
-
万能容器:每个"格子"(元胞)可以存放不同类型、不同尺寸的数据
-
索引规则 :MATLAB索引从 1 开始(与Python的0索引不同)
-
访问方式:
-
()取"盒子"(返回元胞数组的子集,类型仍是元胞数组) -
{}打开"盒子"拿"东西"(返回实际存储的数据类型)
-
Matlab
A=cell(1,6) % 创建一个1行6列的空元胞数组
A{2}=eye(3) %将元胞数组 A 的第2个位置(索引为2)的内容,设置为一个3x3的单位矩阵。单位矩阵对角线为1,其他为0
A{5}=magic(5)
A{3}=ones(3) %n*n方阵 ,全部都是1
MATLAB的根本约束:矩阵必须是同质的,
但是现实世界的数据天然就是混合类型的:
-
Excel表格:列1是姓名(字符串),列2是年龄(数字),列3是工资(数字)
-
实验结果:第一行是标签(字符串),后续是数据(数字)
-
图像处理:彩色图像是RGB三个通道(三维矩阵)+ 元数据(字符串)
元胞数组就是解决这个矛盾的产物------它允许在一个数组里存放不同类型的数据。
2.结构体
结构体(Structure Array) 是一种可以容纳不同类型和大小数据的数据容器,其核心是 通过"字段(Field)" 来访问数据,而不是通过数字索引(像细胞数组那样)。
(1)创建结构体
Matlab
% (1)创建结构方式1-使用 struct 函数
books=struct('name',{{"Machine Learning","data Ming"}},"price",[30,40])
books.name %属性
books.name{2}
books.name(2)
% 创建结构方式2-直接赋值
student.name = 'John Doe';
student.id = 12345;
student.grades = [85, 92, 78];
student.isPass = true;
% 创建结构方式3-创建多个元素
% 方法 A:在赋值时自动扩展
student(1).name = 'Alice';
student(1).score = 90;
student(2).name = 'Bob';
student(2).score = 85;
% 现在 student 是一个 1x2 的结构体数组
% 方法 B:使用 struct 函数批量创建
% 注意:值必须放在 元胞数组 中,且大小一致
students = struct('name', {'Eve', 'Frank'}, 'score', {95, 88});
(2)访问数据
Matlab
% (2)访问数据1-访问标量结构体
% 使用 结构体名.字段名
disp(student.name)
disp(student.grades(2)) % 访问 grades 数组中的第二个元素
% 访问数据2-访问结构体数组
% 获取第二个学生的姓名
disp(students(2).name)
% 获取所有学生的分数(返回逗号分隔列表,通常需要包装在 [] 中)
scores = [students.score]; % 结果为 [95, 88]
% 获取所有学生的姓名(返回元胞数组)
names = {students.name}; % 结果为 {'Eve', 'Frank'}
(3)常用操作与函数
| 函数名 | 功能描述 | 示例 |
|---|---|---|
fieldnames |
获取结构体的所有字段名 | fnames = fieldnames(student) |
isfield |
检查某字段是否存在 | isfield(student, 'age') |
rmfield |
删除指定字段 | student = rmfield(student, 'isPass') |
struct2cell |
将结构体转为元胞数组 | C = struct2cell(student) |
cell2struct |
将元胞数组转为结构体 | S = cell2struct(C, fields, dim) |
orderfields |
对字段进行排序 | S_ordered = orderfields(S) |
isstruct |
判断是否为结构体 | isstruct(student) |
(4)实战技巧与常见坑
技巧 1:动态字段名
如果你的字段名是字符串变量,不要用点号,用括号。
field = 'name';
% 错误: student.field (会去找名为 'field' 的字段)
% 正确:
value = student.(field); % 动态访问 'name'
技巧 2:批量提取数据(向量化)
结构体数组非常利于批量处理。如果所有元素都有相同字段,提取时注意形状。
% 构建 3 个元素的结构体数组
data(1).value = 10;
data(2).value = 20;
data(3).value = 30;
% 提取所有值 (水平拼接)
all_vals = [data.value]; % [10, 20, 30]
% 如果值是字符串,用花括号
names = {data.name};
技巧 3:deal() 函数的使用
用于同时给多个字段或多个结构体元素赋值。
% 同时提取多个字段
[name, id] = deal(student.name, student.id);
技巧 4:将结构体转为表格(最实用)
在数据分析中,通常将结构体数组转为 table 方便查看和筛选。
matlab
% 假设有结构体数组 S
T = struct2table(S);
disp(T); % 漂亮的表格显示
% 也可以转回来: S2 = table2struct(T);
常见坑:
-
维度不匹配 :使用
struct批量创建时,值必须放在元胞数组{}中,否则所有元素会被赋予相同的值。 -
删除字段 :
rmfield不会修改原结构体,必须接收返回值(除非用rmfield(obj, field)的调用方式,但现代 MATLAB 推荐赋值回原变量)。
3. 什么时候用结构体 vs 表 vs 元胞?
| 数据类型 | 适用场景 |
|---|---|
| 结构体 | 层次化数据(如配置文件),字段名很有意义时;处理单个复杂对象。 |
| 表 (Table) | 数据分析首选。像 Excel 一样按列操作,支持筛选、分组、绘图。 |
| 元胞数组 | 数据大小、类型完全不统一,或者用来存放字符串数组。 |
第五部分 矩阵构造和计算
1.矩阵创建
1.1 直接输入法(最基础)
% 行向量(同一行,空格或逗号分隔)
row_vec = [1 2 3 4 5]
row_vec2 = [1,2,3,4,5] % 逗号也可以
% 列向量(分号换行)
col_vec = [1; 2; 3; 4; 5]
% 矩阵(行内用空格/逗号,行间用分号)
A = [1 2 3; 4 5 6; 7 8 9]
% 结果是:
% 1 2 3
% 4 5 6
% 7 8 9
1.2 使用冒号运算符(等差数列)
% 基本用法:start:step:end
v1 = 1:5 % [1 2 3 4 5],默认步长1
v2 = 1:2:10 % [1 3 5 7 9],步长2
v3 = 10:-2:1 % [10 8 6 4 2],负步长
% 指定元素个数(linspace)
v4 = linspace(0, 10, 5) % [0 2.5 5 7.5 10],等间距5个点
v5 = logspace(0, 2, 5) % [1 3.16 10 31.6 100],对数等间距
1.3 特殊矩阵生成函数(必须掌握!)
% 常用特殊矩阵
Z = zeros(3, 4) % 3行4列全零矩阵
O = ones(2, 5) % 2行5列全一矩阵
E = eye(4) % 4x4单位矩阵(对角线为1)
R = rand(3, 3) % 3x3随机矩阵(0~1均匀分布)
N = randn(2, 4) % 2x4正态分布随机矩阵(均值0,方差1)
% 如果只给一个参数,生成方阵
Z2 = zeros(3) % 3x3零矩阵
% 其他实用函数
D = diag([1 2 3]) % 对角矩阵:1 0 0; 0 2 0; 0 0 3
T = triu(A) % 取矩阵A的上三角部分
L = tril(A) % 取矩阵A的下三角部分
M = magic(4) % 4x4魔方矩阵(每行每列和相等)
H = hilb(5) % 5x5希尔伯特矩阵(数值分析用)
1.4 矩阵拼接(组合矩阵)
A = [1 2; 3 4];
B = [5 6; 7 8];
% 水平拼接(列数增加)
C = [A B] % [1 2 5 6; 3 4 7 8]
C2 = horzcat(A, B) % 与 [A B] 等价
% 垂直拼接(行数增加)
D = [A; B] % [1 2; 3 4; 5 6; 7 8]
D2 = vertcat(A, B) % 与 [A; B] 等价
% 使用 repmat 复制矩阵
E = repmat(A, 2, 3) % 将A复制2行3列
% E = [A A A; A A A] (2行A,3列A)
1.5 从文件导入数据(实际工作常用)
% 从文本文件读取
data = load('data.txt'); % 假设文件是纯数字矩阵
% 从Excel读取(需要指定文件)
% data = readmatrix('data.xlsx');
% data = readtable('data.xlsx'); % 读取为表格
% 从mat文件加载
load('data.mat'); % 加载工作区变量
2.矩阵运算
2.1 矩阵加减法
A = [1 2; 3 4];
B = [5 6; 7 8];
% 加减法:对应元素相加减(维度必须相同)
% 要求:要求两个矩阵必须维度完全相同,即行数相同 且 列数相同
C = A + B % [6 8; 10 12]
D = A - B % [-4 -4; -4 -4]
% 标量加减:每个元素都加减该数
E = A + 10 % [11 12; 13 14] ,等价于A + [10 10 10; 10 10 10]
F = A - 3 % [-2 -1; 0 1]
% 注意:A + B 和 A - B 要求维度完全相同
Matlab
function result= safe_matrix_add(A,B)
if isequal(size(A),size(B))
result=A+B;
else
error('❌ 无法相加:A的维度 %dx%d ≠ B的维度 %dx%d', ...
size(A,1), size(A,2), size(B,1), size(B,2));
end
end

D=safe_matrix_add(A,B)
2.2 矩阵乘法
A = [1 2; 3 4];
B = [5 6; 7 8];
% 矩阵乘法(线性代数中的乘法)
% 要求:左矩阵的列数 = 右矩阵的行数
C = A * B % 结果维度:A行数 x B列数
% 计算:[1*5+2*7, 1*6+2*8; 3*5+4*7, 3*6+4*8] = [19 22; 43 50]
% 元素乘法(点乘):对应元素相乘
% 要求:A和B维度完全相同
D = A .* B % [1*5, 2*6; 3*7, 4*8] = [5 12; 21 32]
% 标量乘法:每个元素乘以标量
E = 3 * A % [3 6; 9 12]
F = A * 3 % 与上面一样
Matlab
function result = safe_matrix_multiply(A, B)
% 安全矩阵乘法函数
if size(A, 2) == size(B, 1)
result = A * B;
fprintf('✅ 乘法成功!结果维度: %d x %d\n', size(result,1), size(result,2));
else
error('❌ 无法相乘:A的列数(%d) ≠ B的行数(%d)', size(A,2), size(B,1));
end
end

% 1. 不满足交换律
A * B ≠ B * A
% 2. 满足结合律
(A * B) * C = A * (B * C)
% 3. 满足分配律
A * (B + C) = A * B + A * C
(A + B) * C = A * C + B * C
% 4. 单位矩阵(对角线为1)
I = eye(3);
A = rand(3);
A * I = I * A = A % 单位矩阵就像数字1
2.3
2.3 矩阵除法
(1)左除(\)- 解方程组 AX = B
% 要求:A和B行数相同
% 用途:求解线性方程组 A * X = B
% 示例:解方程组
% 2x + 3y = 8
% 4x + y = 6
A = [2 3; 4 1]; % 系数矩阵(方阵)
B = [8; 6]; % 常数项
X = A \ B; % 解出 X = [1; 2]
% 即:x = 1, y = 2
% 验证
check = A * X; % 应该等于 B
(2)右除(/)- 解方程组 XA = B
% 要求:A和B列数相同
% 用途:求解线性方程组 X * A = B,A / B不等价于 A * inv(B)
A = [2 3; 4 1]; % 系数矩阵(方阵)
B = [8 6; 7 5]; % 常数项
X = B / A; % 相当于 B * inv(A)
% 验证
check = X * A; % 应该等于 B
(3)元素除法(./)
% 要求:两个矩阵的维度必须完全相同
% 规则:对应位置元素相除
A = [1 2; 3 4];
B = [5 6; 7 8];
C = A ./ B; % [1/5, 2/6; 3/7, 4/8]
% 结果:[0.2, 0.333; 0.4286, 0.5]
D = B ./ A; % [5/1, 6/2; 7/3, 8/4]
% 结果:[5, 3; 2.333, 2]
% 注意:A ./ B ≠ B ./ A
(4)除法注意事项
% 1. 除数为零会产生 Inf 或 NaN
A = [1 2; 3 4];
B = [0 1; 2 0];
C = A ./ B; % [Inf, 2; 1.5, Inf]
% 2. 0/0 = NaN(Not a Number)
D = 0 ./ 0; % NaN
% 3. 左除要求矩阵可逆(行列式不为0)
A = [1 2; 2 4]; % 行列式 = 0
B = [3; 6];
% X = A \ B; % 警告!矩阵奇异
2.4 幂运算
A = 1 2; 3 4;
% 矩阵幂:A^2 = A*A(矩阵乘法)
B = A^2 % A*A
% 元素幂:每个元素平方
C = A.^2 % 1\^2, 2\^2; 3\^2, 4\^2 = 1 4; 9 16
% 标量幂:每个元素进行幂运算
D = 2.^A % 2\^1, 2\^2; 2\^3, 2\^4 = 2 4; 8 16
E = A.^0.5 % 每个元素开方
2.5 运算总结对比表
| 运算 | 符号 | 要求 | 结果维度 | 说明 |
|---|---|---|---|---|
| 加法 | + |
维度完全相同 | 不变 | 对应元素相加 |
| 减法 | - |
维度完全相同 | 不变 | 对应元素相减 |
| 矩阵乘法 | * |
A列数 = B行数 | A行数 × B列数 | 线性代数乘法 |
| 元素乘法 | .* |
维度完全相同 | 不变 | 对应元素相乘 |
| 左除 | \ |
行数相同 | 根据方程 | 解 AX = B |
| 右除 | / |
列数相同 | 根据方程 | 解 XA = B |
| 元素除法 | ./ |
维度完全相同 | 不变 | 对应元素相除 |
3.矩阵常用函数
Matlab
A = rand(3, 4);
size(A) % [3, 4]
size(A, 1) % 行数 = 3
size(A, 2) % 列数 = 4
length(A) % 最大维度 = 4(对于矩阵)
numel(A) % 元素总数 = 12
ndims(A) % 维度数 = 2
% 判断矩阵特性
isempty(A) % 是否为空
isscalar(A) % 是否为标量
isvector(A) % 是否为向量
ismatrix(A) % 是否为矩阵
A = [1 2 3; 4 5 6; 7 8 9];
% 默认按列操作(dim=1)
sum(A) % 每列求和:[12 15 18]
mean(A) % 每列均值:[4 5 6]
max(A) % 每列最大值:[7 8 9]
min(A) % 每列最小值:[1 2 3]
std(A) % 每列标准差
var(A) % 每列方差
% 按行操作(dim=2)
sum(A, 2) % 每行求和:[6; 15; 24]
mean(A, 2) % 每行均值:[2; 5; 8]
% 全部元素统计
sum(A, 'all') % 所有元素求和 = 45
mean(A, 'all') % 所有元素均值 = 5
max(A, [], 'all') % 全局最大值 = 9
% 累积操作
cumsum(A) % 按列累积和
cumprod(A) % 按列累积积
% 排序
sort(A) % 每列升序排列
sort(A, 'descend') % 每列降序
sortrows(A) % 按第一列排序整行
A = [1 2 3; 4 5 6];
% 转置
A' % 共轭转置(复数用)
A.' % 普通转置
% 重塑
B = reshape(A, 3, 2) % 改变形状,元素个数必须相同
% A = [1 2 3; 4 5 6] -> reshape为3x2
% 注意是按列填充:B = [1 3 5; 4 6 2]? 不对!
% 正确:按列优先:[1;4;2;5;3;6] -> reshape为 [1 5 3; 4 2 6]
% 翻转
fliplr(A) % 左右翻转:[3 2 1; 6 5 4]
flipud(A) % 上下翻转:[4 5 6; 1 2 3]
rot90(A) % 逆时针旋转90度
rot90(A, 2) % 旋转180度
% 提取对角线
diag(A) % 提取主对角线元素
diag(A, 1) % 提取上对角线(偏移1)

4.矩阵索引
Matlab
A = [1 2 3 4; 5 6 7 8; 9 10 11 12];
% 单个元素:A(行, 列)
A(2, 3) % 第2行第3列 = 7
A(1, 4) % 第1行第4列 = 4
% 整行:A(行, :)
A(2, :) % 第2行所有列 = [5 6 7 8]
% 整列:A(:, 列)
A(:, 3) % 第3列所有行 = [3; 7; 11]
% 子矩阵:A(行范围, 列范围)
A(2:3, 1:2) % 第2-3行,第1-2列
% 结果:[5 6; 9 10]
A = magic(5); % 5x5魔方矩阵
% 使用 end 关键字(表示最后一维)
A(1:2, end-1:end) % 第1-2行,最后两列
A(end, :) % 最后一行
A(:, end) % 最后一列
% 不连续索引
rows = [1 3 5];
cols = [2 4];
A(rows, cols) % 选取第1,3,5行和第2,4列交叉的元素
% 线性索引(按列优先顺序)
A(7) % 按列排列后的第7个元素
% 如果 A = [1 2; 3 4],按列排列为 [1;3;2;4]
% A(3) = 2
A = [1 2 3; 4 5 6; 7 8 9];
% 创建逻辑矩阵
mask = A > 5; % 返回逻辑矩阵:[0 0 0; 0 0 1; 1 1 1]
A(mask) % 返回所有大于5的元素:[6; 7; 8; 9]
% 直接使用条件修改元素
A(A > 5) = 0 % 将所有大于5的元素设为0
% A = [1 2 3; 4 5 0; 0 0 0]
% 使用 find 函数获取位置
[row, col] = find(A > 5) % 返回行和列索引
indices = find(A > 5) % 返回线性索引
% 实际应用:替换异常值
data = [1.5, 2.3, 999, 1.8, 2.1, -999];
data(data == 999 | data == -999) = NaN; % 将异常值替换为NaN
data(isnan(data)) = mean(data, 'omitnan'); % 用均值替换NaN
A = [1 2 3; 4 5 6; 7 8 9];
% 创建逻辑矩阵
mask = A > 5; % 返回逻辑矩阵:[0 0 0; 0 0 1; 1 1 1]
A(mask) % 返回所有大于5的元素:[6; 7; 8; 9]
% 直接使用条件修改元素
A(A > 5) = 0 % 将所有大于5的元素设为0
% A = [1 2 3; 4 5 0; 0 0 0]
% 使用 find 函数获取位置
[row, col] = find(A > 5) % 返回行和列索引
indices = find(A > 5) % 返回线性索引
% 实际应用:替换异常值
data = [1.5, 2.3, 999, 1.8, 2.1, -999];
data(data == 999 | data == -999) = NaN; % 将异常值替换为NaN
data(isnan(data)) = mean(data, 'omitnan'); % 用均值替换NaN

第六部分 绘图
1.常用绘图函数速查
| 函数 | 用途 | 示例 |
|---|---|---|
plot() |
二维线图 | plot(x, y) |
scatter() |
散点图 | scatter(x, y) |
bar() |
条形图 | bar(x, y) |
histogram() |
直方图 | histogram(data) |
boxplot() |
箱线图 | boxplot(data) |
pie() |
饼图 | pie(data) |
area() |
面积图 | area(x, y) |
plot3() |
三维线图 | plot3(x, y, z) |
surf() |
三维曲面 | surf(X, Y, Z) |
mesh() |
三维网格 | mesh(X, Y, Z) |
contour() |
等高线 | contour(X, Y, Z) |
contourf() |
填充等高线 | contourf(X, Y, Z) |
surfc() |
曲面+等高线 | surfc(X, Y, Z) |
Matlab
% 常用属性
set(gca, 'FontSize', 12); % 字体大小
set(gca, 'XGrid', 'on'); % X轴网格
set(gca, 'YGrid', 'on'); % Y轴网格
set(gca, 'Box', 'on'); % 边框
set(gca, 'Color', [0.95, 0.95, 0.95]); % 背景色
set(gca, 'XColor', [0.2, 0.2, 0.2]); % 轴颜色

% 颜色和线型组合
% 颜色: r(红), g(绿), b(蓝), c(青), m(品红), y(黄), k(黑), w(白)
% 线型: - (实线), -- (虚线), : (点线), -. (点划线)
% 标记: o (圆), + (加号), * (星号), . (点), x (叉号), s (方块), d (菱形)
Matlab
plot(x, y, 'r-', 'LineWidth', 2); % 红色实线,宽度2
plot(x, y, 'bo-', 'MarkerSize', 8); % 蓝色圆圈连接线
plot(x, y, 'g--s', 'MarkerFaceColor', 'g'); % 绿色虚线,方块标记

2.二维绘图
x = 起始值 : 步长 : 结束值
↓ ↓ ↓
0 0.1 2*pi
Matlab
% 简单绘图
x = 0:0.2:2*pi;
y = sin(x);
plot(x, y); % 绘制正弦曲线
% 多个图形
x = 0:0.2:3*pi;
y = sin(x);
y1=2*x+1;
y2=cos(x)+3;
plot(x, y,x,y1,x,y2);

Matlab
% subplot(行数, 列数, 位置)
figure; % 新建图形窗口
subplot(2, 2, 1); % 2行2列,第1个
x = 0:0.1:2*pi;
plot(x, sin(x));
title('正弦');
grid on;% 打开网格
subplot(2, 2, 2); % 第2个
plot(x, cos(x));
title('余弦');
grid on;
subplot(2, 2, 3); % 第3个
plot(x, tan(x));
title('正切');
ylim([-5, 5]);
grid on;
subplot(2, 2, 4); % 第4个
plot(x, sin(x).*cos(x));
title('乘积');
grid on;


图形修饰和标注
Matlab
x = 0:0.01:2*pi;
y = sin(x);
plot(x, y, 'b-', 'LineWidth', 2);
% 标题和轴标签
title('正弦函数图像', 'FontSize', 14, 'FontWeight', 'bold');
xlabel('x (弧度)', 'FontSize', 12);
ylabel('sin(x)', 'FontSize', 12);
% 坐标轴范围
xlim([0, 2*pi]);
ylim([-1.5, 1.5]);
% 网格
grid on;
grid minor; % 更精细的网格
% 图例
legend('sin(x)', 'Location', 'northeast');
% 文本标注
text(pi/2, 1, '最大值点', 'HorizontalAlignment', 'center');
text(3*pi/2, -1, '最小值点', 'HorizontalAlignment', 'center');
% 箭头标注
annotation('arrow', [0.3, 0.35], [0.7, 0.65]);

2.三维绘图
三维绘图函数
├── 1. 三维曲线
│ └── plot3() % 三维线图
│
├── 2. 三维曲面/网格
│ ├── surf() % 彩色曲面图
│ ├── mesh() % 网格图
│ ├── surfc() % 曲面+等高线
│ ├── meshc() % 网格+等高线
│ ├── surfl() % 带光照的曲面
│ └── waterfall() % 瀑布图
│
├── 3. 等高线图
│ ├── contour() % 等高线图
│ ├── contourf() % 填充等高线
│ └── contour3() % 三维等高线
│
├── 4. 散点和杆状图
│ ├── scatter3() % 三维散点图
│ ├── stem3() % 三维杆状图
│ └── ribbon() % 缎带图
│
└── 5. 专业可视化
├── isosurface() % 等值面
├── slice() % 切片图
├── streamline() % 流线图
└── quiver3() % 三维矢量场
类型1:连续面数据(最常见)
特征: Z 是 X、Y 的连续函数,数据点密集形成"面"
| 场景 | 具体例子 | 推荐函数 | 为什么 |
|---|---|---|---|
| 展示整体趋势 | 地形海拔、温度分布 | surf() |
彩色面最直观 |
| 查看网格结构 | 数值计算网格 | mesh() |
只显示线条,看得清结构 |
| 需要精确读数 | 地形图+等高线 | surfc() |
曲面+底部等高线投影 |
| 强调波动 | 金融波动曲面 | surfl() |
光照效果突出起伏 |
| 时序数据 | 地震波形演化 | waterfall() |
像瀑布一样显示变化 |
类型2:离散点数据
特征: 数据是孤立的点,没有连续面
| 场景 | 具体例子 | 推荐函数 | 为什么 |
|---|---|---|---|
| 查看分布 | 城市人口分布 | scatter3() |
点的大小和颜色可表示更多信息 |
| 显示数值 | 各站点的测量值 | stem3() |
像"钉子"一样显示数值大小 |
| 展示聚类 | 机器学习聚类结果 | scatter3() |
用不同颜色标记不同类别 |
类型3:曲线轨迹
特征: 数据按时间或路径顺序排列,形成三维曲线
| 场景 | 具体例子 | 推荐函数 | 为什么 |
|---|---|---|---|
| 基本运动轨迹 | 飞机航迹、弹道 | plot3() |
最基础,支持多条曲线 |
| 带时间标记 | 需要看运动速度 | plot3() + 颜色渐变 |
颜色表示时间 |
类型4:体数据(三维空间中的值)
特征: 数据在三维空间中都有值,如 CT 扫描、温度场
| 场景 | 具体例子 | 推荐函数 | 为什么 |
|---|---|---|---|
| 看内部结构 | CT/MRI 扫描 | slice() |
可以看任意切片 |
| 看表面 | 三维模型表面 | isosurface() |
提取等值面 |
| 看整体分布 | 三维云图 | volshow() |
整体渲染 |
类型5:矢量场
特征: 每个点有方向(箭头),如风力、电磁场
| 场景 | 具体例子 | 推荐函数 | 为什么 |
|---|---|---|---|
| 风场/水流 | 天气预报风场 | quiver3() |
箭头表示方向 |
| 电磁场 | 磁场分布 | quiver3() |
显示方向和大小 |
类型6:等高线(2D投影)
特征: 把3D数据投影到2D平面
| 场景 | 具体例子 | 推荐函数 | 为什么 |
|---|---|---|---|
| 地形图 | 登山地图 | contourf() |
填充颜色更直观 |
| 等温线 | 天气图 | contour() |
只画线,不填充 |
| 3D展示 | 在三维中显示等高线 | contour3() |
立体等高线 |
汇总:
| 数据类型 | 您想干什么 | 用什么 | 一句话说明 |
|---|---|---|---|
| 连续面 | 看整体趋势 | surf() |
最直观,像真实地形 |
| 连续面 | 看网格结构 | mesh() |
只有线,看清骨架 |
| 连续面 | 要精确读数 | surfc() |
曲面+投影等高线 |
| 连续面 | 强调起伏 | surfl() |
加光照,立体感强 |
| 连续面 | 只看高度 | contourf() |
俯视,填色等高线 |
| 离散点 | 看分布 | scatter3() |
点的大小颜色代表数值 |
| 离散点 | 显示数值 | stem3() |
像钉子从地面"长"出来 |
| 轨迹 | 看路径 | plot3() |
最简单的3D连线 |
| 体数据 | 看内部 | slice() |
像切片面包 |
| 体数据 | 看表面 | isosurface() |
提取"外壳" |
| 矢量场 | 看方向 | quiver3() |
箭头指示方向 |
实际工作中80%的3D图只有3种
% 第1名:surf() - 50% 的使用场景
% 场景:任何连续面数据
surf(X, Y, Z);
% 第2名:scatter3() - 25% 的使用场景
% 场景:任何离散点数据
scatter3(x, y, z, size, color);
% 第3名:contourf() - 15% 的使用场景
% 场景:地形图、热力图
contourf(X, Y, Z);
% 其他所有函数 - 10%
第七部分 程序结构
matlab的新建:

| 选项 | 中文名称 | 文件扩展名 | 用途 | 何时使用 | 重要特点 |
|---|---|---|---|---|---|
| 脚本 | 脚本文件 | .m |
编写和执行MATLAB命令序列 | 自动化重复性任务、简单计算、数据探索 | 共享工作区变量、无输入输出、从上到下执行、适合初学者 |
| 实时脚本 | 实时脚本 | .mlx |
交互式文档,代码+文本+图混合 | 制作教程、演示、报告、教学 | 支持Markdown格式、可插入图片/方程、分节运行、交互式控件 |
| 函数 | 函数文件 | .m |
创建可重复使用的代码模块 | 编写可调用的算法、模块化编程 | 有输入输出参数、独立工作区、可被其他程序调用、可设置默认参数 |
| 实时函数 | 实时函数 | .mlx |
带文档的函数(代码+说明混合) | 创建带详细文档和示例的函数 | 函数文件+实时文档、自带说明、便于分享 |
| 类 | 类文件 | .m |
面向对象编程(OOP) | 大型项目、数据封装、继承多态 | 包含属性和方法、支持继承、封装数据和行为 |
| 测试类 | 测试类 | .m |
单元测试代码 | 验证函数正确性、自动化测试 | 继承matlab.unittest.TestCase、系统化测试框架 |
| System object | 系统对象 | .m |
创建自定义系统对象 | Simulink自定义模块、信号处理 | 用于Simulink仿真、有状态的对象、支持代码生成 |
| 文本文件 | 文本文件 | .txt |
存储纯文本数据 | 配置文件、数据交换、日志文件 | 纯文本格式、跨平台兼容、无格式限制 |
| 工程 | 工程文件 | .prj |
管理大型项目文件 | 多人协作、大型项目、版本控制 | 管理所有文件、依赖关系、路径管理、与Git集成 |
| Git 克隆 | Git仓库克隆 | - | 从远程Git仓库克隆项目 | 团队协作、开源项目、版本控制 | 自动下载完整仓库、保留版本历史 |
| SVN 签出 | SVN仓库签出 | - | 从SVN仓库签出项目 | 团队协作、版本控制(旧系统) | 与SVN服务器交互、版本管理 |
| 图窗 | 图形窗口 | .fig |
保存和打开MATLAB图形 | 保存绘制的图表、可交互的图形 | 保留所有图形属性、可交互、便于修改 |
| App | App设计文件 | .mlapp |
创建图形用户界面(GUI) | 开发交互式工具、非编程人员使用 | 可视化拖拽设计、代码自动生成、可打包为exe |
| Simulink 模型 | Simulink模型 | .slx |
创建Simulink仿真模型 | 系统仿真、控制设计、信号处理 | 图形化建模、支持代码生成、丰富的模块库 |
| 文件夹 | 文件夹 | - | 组织文件结构 | 分类管理文件、组织项目 | 不影响MATLAB功能、便于文件管理 |
项目结构:

