MATLAB-matlab基础知识

一、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 + SpaceTab 代码自动补全,输入函数或变量名前几个字母后使用,可查看提示和补全。
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 部分)

运行后工作区会同时存在 Aa,证明区分大小写

错误写法 原因 正确写法
2a = 5 不能以数字开头 a2 = 5
my-var = 3 不能使用减号(会被当成运算符) my_var = 3myVar = 3
for = 10 不能使用MATLAB关键字(for, if, end等) for_val = 10

MATLAB命名惯例(非强制,但强烈建议)

  • 变量名:小写驼峰,如 myData, signalLength

  • 常量:全大写,如 PI, GRAVITY

  • 避免用 ij 做变量名(它们默认是虚数单位)

第三部分:数据类型(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);
常见坑:
  1. 维度不匹配 :使用 struct 批量创建时,值必须放在元胞数组 {} 中,否则所有元素会被赋予相同的值。

  2. 删除字段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功能、便于文件管理

项目结构:

相关推荐
落羽的落羽1 小时前
【AI】快速理解AI应用的相关名词概念
linux·c++·人工智能·python·计算机网络·算法
Nil2081 小时前
leetcode 17电话号码的字母组合
算法·leetcode·职场和发展
Vcaker1 小时前
Linux学习25-harbor私有仓库部署
linux·运维·学习
留白_2 小时前
【tableau入门学习】5、筛选器、参考线和集
学习·tableau
youm20032 小时前
认识Redis
redis·笔记·学习
亮工硬件3 小时前
1-11 STM32内部FLASH(数据掉电保存)
笔记·stm32·单片机·嵌入式硬件·学习
传奇开心果编程3 小时前
【Rust入门知识点学与练】第17课:闭包 Closures
开发语言·学习·rust
203号居民3 小时前
LeetCode hot 100 — 25. K 个一组翻转链表
算法·leetcode·链表
今夜有雨.3 小时前
C# 学习文档(零基础入门)
开发语言·学习·c#