【数学建模|Matlab】Matlab「基础知识」和「基础操作」
- 第 114 篇 -
Date: 2025 - 07 - 22
Author: 郑龙浩(仟墨)
一 窗口认识
1 当前文件夹
最左侧有一个当前文件夹
最上方的横框中表示的就是当前文件夹的路径,可以将想打开的文件夹copy到这
2 命令行窗口 与 编辑器
命令行窗口:
在中间的是命令行窗口,是我们直接操作的地方
在这比如输入
1 + 2
按一下回车,就会得出:
ans = 3
可以直接进行计算
还可以定义变量,比如输入a = 3
回车,再输入b = 5
回车,再输入a - b
得到
ans = -2
编辑器:
单击主页中的新建,选择脚本,此时就可以新建一个脚本,以.m
结尾
这个脚本就在编辑器中打开了
可以提前将代码写在编辑器的注释中,然后想运行哪段代码,就选中那部分,然后右击,选择在命令行窗口执行所选内容之类的选项,就可以在命令行窗口中执行对应的命令了。
4 工作区
当输入命令的时候,右侧的工作区窗口内会显示当前的操作以及变量
二 基本知识与操作
1 命名规则
- 变量名区分大小写
- 变量名必须是以字母开头,可以是由字母、数字、下划线组成的,不可以有其他的字符
- 变量名有对应的长度要求,但是一般不会写这么长,写的名字应该尽量简洁明了
2 清空命令和工作区
clear all
清空工作区窗口的所有变量(内容)clc
清空命令行窗口的所有命令(内容)
3 注释
在matlab中如果想进行注释,两种
-
两个百分号
在开头和结尾需要写两个
%%
%% 注释 123 4556 %%
-
%
一行注释,只需要在某行的开头写一个
%
即可% 注释1 % 注释2
4 数据类型 - 数字
1
23
56
全都是
5 数据类型 - 字符、字符串
% 字符
ch = 'a'
% 字符串
str = 'abcdef'
字符在内存中是以 ASCIl 码进行存储的,所以也是可以计算的,Eg:
字符‘a’
的码:97
>> ch = 'a'
ch + 1
char(97)ch ='a'ans =98ans ='a'
char可以将对应ASCII码转为字符,length可以得出字符串长度
>> length('abc')ans =3
6 数据类型 - 矩阵
- 矩阵的创建
>> A = [1 2 3; 4 5 6; 7 8 9]A =1 2 34 5 67 8 9
-
矩阵的转置
行变列,列变行
>> A'
ans =1 4 72 5 83 6 9
- 将矩阵
A
的所有元素按列优先顺序重新排列成一个列向量
>> A(:) ans =147258369
这个会用于比如求和
在执行sum(A)
的时候是将每一列求和,答案是 [5 7 9](即 1+4, 2+5, 3+6)
想要将所有元素求和,就得将A中的所有元素展开为列向量(A(😃),然后在求和
sum(A(:)) % 输出: 45
-
矩阵的逆
-
必须方阵
-
如果矩阵是奇异或者非奇异会警告
A = [1 2 3; 4 5 6; 2 3 5] inv(A) % 求矩阵的逆 % 结果为:-2.3333 0.3333 1.00002.6667 0.3333 -2.0000-0.6667 -0.3333 1.0000
-
-
两个矩阵的运算
按照矩阵运算进行计算的
A * B A / B A + B A - b % 结果 >> A * B A / B A + B A - Bans =40 7 1988 22 4965 12 33ans =0.5984 0.1024 -0.02361.1890 0.7165 -0.16540.9370 0.0945 0.0551ans =2 5 810 7 711 3 9ans =0 -1 -2-2 3 5-7 3 1
-
创建全为0的矩阵 二维三维都可以
zeros(x,y,z) x为行 y为列 z为三维维度
>> A = zeros(5) A = zeros(2, 5) A = zeros(2, 5, 3)A =0 0 0 0 00 0 0 0 00 0 0 0 00 0 0 0 00 0 0 0 0A =0 0 0 0 00 0 0 0 0A(:,:,1) =0 0 0 0 00 0 0 0 0A(:,:,2) =0 0 0 0 00 0 0 0 0A(:,:,3) =0 0 0 0 00 0 0 0 0
-
单位矩阵
生成单位矩阵(对角线为 1,其余为 0)
eye(n) % n×n 单位矩阵 eye(m, n) % m×n 的矩形单位矩阵
-
幻方矩阵
magic 英文:魔方
各行、列、对角线之和相等
magic(n) % n×n 的幻方矩阵(n ≥ 3)
7 数据类型 - 元胞数组
① 基本介绍
其中每一个存储的独立数据单元叫做元胞
MATLAB 的元胞数组类似 C 中的结构体,但更灵活——每个单元可以存任意类型数据(数字、文本、矩阵等),无需像 C 那样提前定义类型,直接通过 {}
访问内容
在C中是这样:
struct Data {int num;char str[10];float arr[2][2];
};
struct Data B = {10, "hello", {{1,2},{3,4}}};
printf("%s", B.str); // 输出: hello
在matlab中是这样:
disp()是输出函数
A = {10, 'hello', [1 2; 3 4]}; % 混合类型
disp(A{1});
disp(A{2});
disp(A{3});
%% 打印 10hello1 23 4
%%
② 使用{}创建元胞数组
B = {'text', 100, magic(3)}; % 创建1×3元胞数组
C = {1, 'a'; [2 3], true}; % 创建2×2元胞数组
③ 使用cell()创建元胞数组
D = cell(2,3); % 创建2×3空元胞数组
D{1,1} = 'MATLAB'; % 填充数据
D{2,2} = 1:5;
元胞也可以存储矩阵
8 数据类型 - 结构体
(1)基本介绍
类似于Python中的字典
结构体是一种可以存储不同类型数据的容器
每个字段可以存数字、文本、矩阵等任意数据
(2)创建
% 方法1:直接赋值
student.name = 'matlab';
student.nums = 20;% 方法2:用 struct() 函数
teacher = struct('name', 'aaa', 'subject', 'Math');
(3) 访问字段/属性 ,修改新增字段
disp(student.name); % 输出: matlab、
student.age = 21; % 修改字段
student.grade = [90, 85]; % 新增字段
(4)student.name(1)
vs student.name{1}
student.name(1)
-
用于:结构体字段是普通数组/字符串时
-
作用:取字段内容的第1个元素 取出的是对应的数据类型的值
student.name = 'Alice'; student.name(1) % 输出 'A',取出的是字符
student.name{1}
-
用于:结构体字段是元胞数组时
-
作用:取元胞数组的第1个元胞的内容,取出的是cell类型
student.name = {'Alice', 'Bob'}; disp(student.name{1}); % 输出 'Alice'(字符串,是元胞的内容) disp(student.name(1)); % 输出 {'Alice'}(cell 类型)
8 生成随机数
函数 | 输出类型 | 默认范围 | 用途 |
---|---|---|---|
rand | 浮点数 | [0,1) | 均匀分布模拟 |
randn | 浮点数 | N(0,1) | 正态分布模拟 |
randi | 整数 | [1,imax] | 离散随机选择 |
-
rand()
功能:生成[0,1)均匀分布的浮点数
rand(m,n) % m×n矩阵rand([m n]) % 同上rand(size(A)) % 与A同维
-
randn()
功能:生成标准正态分布(均值μ=0,方差σ²=1)的随机数
randn(m,n) % m×n矩阵
-
randi()
功能:生成均匀分布的随机整数
randi(imax) % 1个[1,imax]整数 randi(imax,m,n) % m×n矩阵 randi([imin,imax]) % 指定范围
三 矩阵操作
1 矩阵的创建
A = [1 2 3; 2 3 5; 4 5 2]
B = 1: 2: 9 % 生成等差数列的行向量
%% 特殊矩阵
zeros(m, n) % m * n 全零矩阵
ones(m, n) % m * n 全1
eye(m, n) % 单位矩阵
rand(m, n) % 范围[0,1), 均匀分布随机矩阵 m * n
randn(m, n) % 标准正态分布随机矩阵
magic(n) % 幻方矩阵
diag(v) % 对角矩阵
%%
函数 | 作用 | |
---|---|---|
zeros(m,n) | 全零矩阵 | zeros(2,3) → 2×3零矩阵 |
ones(m,n) | 全1矩阵 | ones(1,4) → [1 1 1 1] |
eye(m,n) | 单位矩阵(对角线为1) | eye(3) → 3×3单位矩阵 |
rand(m,n) | [0,1)均匀分布随机矩阵 | rand(2,2) → 2×2随机数 |
randn(m,n) | 标准正态分布随机矩阵 | randn(3,1) → 3×1随机数 |
magic(n) | 幻方矩阵(行、列、对角线之和相等) | magic(3) → 3×3幻方 |
diag(v) | 用向量生成对角矩阵 | diag([1 2]) → [1 0; 0 2] |
2 四则运算
如果不加.
就是指的用矩阵的运算规则计算
如果.
,就是指的对应元素相乘相除
% 定义修改后的矩阵(数值已调整)
A = [2 4 6 8; 10 12 14 16];
B = [3 3 1 1; 1 1 3 3];% 基础运算
C = A + B % 矩阵加法
D = A - B % 矩阵减法
E = A * B' % 矩阵乘法(A × B的转置)% 逐元素运算
F = A .* B % 点乘(对应元素相乘)
H = A ./ B % 点除(对应元素相除)% 矩阵除法
G = A / B % 矩阵右除(求解 G*B = A)
% 验证:G * B ≈ A
3 矩阵的下标
代码
A = magic(5);
disp(A) % 全部
disp(A(1, 2)); % 第1行,第2列
disp(A(2,:)); % 第2行,所有列
disp(A(:,4)); % 所有行,第4列
运行结果
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 92423 5 7 14 168
14
20
21
2
代码
find(A > 20) % 找到所有比20大的值,并且返回是第几个(横着数,到头换到下一行)
[m, n] = find(A > 20) % 找到比20大的所有的值,并将下标存到[m, n]
[m, n] = find(A == 21) % 找到等于21的所有的值,并将下标存到[m, n]
结果
n是行,m是列
ans =26151923m =21543n =12345m =4n =4
四 流程控制
其实和C中的还是挺像的
1 if…else…end
- 可以嵌套使用
- else和elseif是可选的,if必须写的
if 条件表达式% 条件成立时执行的代码
elseif 其他条件% 备选条件代码
else% 所有条件不满足时的默认代码
end
2 for…end
- 步长默认为1,可以省略
- 起始值、步长、结束值可以是:正数、负数或小数
- 循环变量会在每次迭代后自动更新
for 循环变量 = 起始值:步长:结束值执行语句...
end
3 while…end
- 在迭代前检查循环条件
- 适合循环次数不确定的情况
- 必须保证循环条件可以变为false,不然会死循环
while 循环条件% 循环体代码
end
4 switch…case…end
- 比多个if else清晰得多
- case值可以是 数值或字符串
- otherwise 分支是可以去掉的
switch 表达式case 值1% 匹配值1的代码case ...% 联合处理代码...otherwise% 默认执行代码 --> 如果表达式的值不与上面任何一个匹配才执行这个
end
5 例题
1)求 1^2 + 2^2 + … + 5^2
>> sum = 0;
for n = 1:5sum = sum + n^2;
end
disp(sum)%% 答案 55
2)使用for循环求$$
\sum_{i=1}^{5} i!
$$ 的值
也就是1到5的阶乘之和
>> sum = 0;
for i = 1:5n = 1;for j = 1:in = n * j;endsum = sum + n;
end
disp(sum)
%% 答案 153
3)求 1 + 2 + 3 + … + 10 的和
>> sum = 0;
n = 1;
while n <= 10sum = sum + n;n = n + 1;
end
disp(sum)
>> sum = 0;
for i = 1:10sum = sum + i;
end
disp(sum)
结果:55
……