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\binv(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基础语法 变量与数据类型 double / int8 / logical char / string 矩阵与数组操作 创建 / 索引 / 切片 点乘 vs 矩阵乘 流程控制 if / for / while break / continue 函数与脚本 函数定义 / 匿名函数 脚本 vs 函数 核心:一切皆矩阵,操作向量化

这一节的内容,说白了就是Matlab的「内功心法」。变量类型决定了内存占用,矩阵操作决定了代码效率,流程控制决定了逻辑清晰度,函数封装决定了代码复用性。我在实际项目中,80%的代码都在跟矩阵打交道。你把这些练熟了,后面Simulink建模就是水到渠成的事。


专注资料整理