2. Matlab基础语法速通:变量与数据类型、矩阵与数组操作、流程控制(if/for/while)、函数定义与脚本编写
说实话,很多做嵌入式的兄弟一上来就怼着Simulink拖模块,结果模型跑起来一堆bug,回头一看,连Matlab基础都没打牢。我个人习惯是,先花半天把Matlab当一门正经语言捋一遍,后面建模才顺手。这一节,咱们就把最核心的语法过一遍。
2.1 变量与数据类型——别小看这个
Matlab的变量不需要提前声明类型。你直接写 a = 5,它就自动认成double。我刚开始用的时候觉得这太方便了,后来在项目中吃过亏——有一次从传感器读数据,没注意类型转换,算出来的结果全是错的。嗯,这里要注意。
常用的数据类型有这些:
| 类型 | 说明 | 示例 |
|---|---|---|
| double | 双精度浮点(默认) | x = 3.14 |
| single | 单精度浮点(省内存) | y = single(3.14) |
| int8 / uint8 | 有/无符号8位整数 | z = int8(127) |
| logical | 逻辑型(true/false) | flag = true |
| char / string | 字符/字符串 | str = "hello" |
注意: 嵌入式开发中,能用int8就别用double。我曾经在STM32上跑Matlab生成的代码,因为用了double导致RAM爆了,后来全改成single才搞定。
2.2 矩阵与数组操作——Matlab的灵魂
说白了,Matlab就是为矩阵而生的。你想想看,在C语言里你要写个for循环才能算个矩阵乘法,在Matlab里一行搞定。
创建矩阵很简单:
% 行向量
v = [1 2 3 4]
% 列向量
v_col = [1; 2; 3; 4]
% 矩阵
A = [1 2 3; 4 5 6; 7 8 9]
% 等差数列
t = 0:0.1:10 % 从0到10,步长0.1
索引操作是高频用法。记住,Matlab索引从1开始,不是0。我刚开始老犯这个错:
A(2, 3) % 第2行第3列
A(:, 1) % 所有行的第1列
A(1:2, :) % 第1到2行的所有列
小技巧: 用
end 关键字可以快速取到最后一行/列。比如 A(end, :) 就是最后一行。
矩阵运算要分清点乘和矩阵乘:
A * B % 矩阵乘法
A .* B % 对应元素相乘(点乘)
我在做电机控制算法时,经常用 inv() 求逆矩阵,但后来发现 A\b 比 inv(A)*b 更快更稳。你试试看。
2.3 流程控制——if/for/while
流程控制跟C语言很像,但语法更友好。先看if:
if x > 0
disp('正数')
elseif x == 0
disp('零')
else
disp('负数')
end
for循环,我最常用它来遍历数组:
for i = 1:10
disp(i)
end
% 遍历矩阵
for row = 1:size(A, 1)
for col = 1:size(A, 2)
A(row, col) = A(row, col) * 2;
end
end
避坑指南: 我曾经在循环里不断扩展数组,导致程序越跑越慢。后来改成预分配内存,速度提升了10倍。记住:
v = zeros(1, 1000) 先分配好空间。
while循环,适合不知道循环次数的情况:
n = 0;
while n < 100
n = n + 1;
if mod(n, 10) == 0
continue % 跳过10的倍数
end
if n > 50
break % 超过50就停
end
end
2.4 函数定义与脚本编写
脚本就是一堆命令的集合,保存成.m文件直接运行。但函数不一样,它有独立的变量空间。
函数的基本结构:
function [输出1, 输出2] = 函数名(输入1, 输入2)
% 函数体
输出1 = 输入1 + 输入2;
输出2 = 输入1 * 输入2;
end
举个例子,写一个计算均值与方差的函数:
function [mean_val, var_val] = calc_stats(data)
% 计算数据的均值和方差
n = length(data);
mean_val = sum(data) / n;
var_val = sum((data - mean_val).^2) / (n - 1);
end
调用的时候:
data = [1 2 3 4 5];
[m, v] = calc_stats(data);
fprintf('均值: %.2f, 方差: %.2f\n', m, v);
建议: 每个函数开头写清楚输入输出。我见过太多同事写的函数,三个月后自己都看不懂。加一行注释,省下半天调试时间。
匿名函数也很实用,适合简单运算:
f = @(x) x^2 + 2*x + 1;
f(3) % 返回16
2.5 知识体系总览
下面这张图把这一节的核心逻辑串起来了。你顺着看,就知道学Matlab到底要抓哪几个点。
这一节的内容,说白了就是Matlab的「内功心法」。变量类型决定了内存占用,矩阵操作决定了代码效率,流程控制决定了逻辑清晰度,函数封装决定了代码复用性。我在实际项目中,80%的代码都在跟矩阵打交道。你把这些练熟了,后面Simulink建模就是水到渠成的事。