第一章 MATLAB基础操作回顾:工作区与路径管理、常用数据类型与矩阵操作、脚本与函数编写、调试工具的使用

各位工程师朋友,大家好。我是老张,在运动控制这个行当摸爬滚打了十几年。今天咱们开始聊MATLAB,别急着划走——我知道很多人觉得MATLAB就是个“高级计算器”,但说实话,真正用好它的人,效率能甩开别人几条街。

这一章,我带你快速过一遍MATLAB最核心的基础操作。嗯,都是干货,没有废话。

1.1 工作区与路径管理——别让文件“跑丢了”

我刚入行那会儿,最头疼的就是文件管理。写了一大堆脚本,结果第二天打开MATLAB,找不到昨天保存的变量了。你想想看,多耽误事。

工作区(Workspace) 就是你当前MATLAB环境里所有变量的“大本营”。你算出来的数据、加载的模型,全在这儿。我建议你养成一个好习惯:每次开始新项目,先执行 clear all 清空工作区,避免旧数据干扰新计算。

我的小技巧:save('workspace.mat') 保存整个工作区,下次用 load('workspace.mat') 一键恢复。我在调试运动控制算法时,经常把中间结果存下来,方便对比不同参数的效果。

路径管理 就更关键了。MATLAB默认只搜索当前文件夹和已添加的路径。如果你写了一个函数,放在别的文件夹里,MATLAB找不到就会报错。

我曾经犯过一个低级错误:把自定义函数放在桌面,结果换了台电脑,所有脚本都跑不起来了。后来我学乖了,用 addpathrmpath 管理路径。更规范的做法是:把所有项目文件放在同一个根目录下,用 cd 切换到该目录。

% 添加路径示例
addpath('C:\MyProject\Functions');  % 添加自定义函数文件夹
savepath;                           % 保存路径设置,下次启动自动加载
注意: 不要随意添加系统盘下的路径,尤其是C盘。MATLAB路径多了会影响启动速度。我一般只保留项目相关的3-5个路径。

1.2 常用数据类型与矩阵操作——MATLAB的“灵魂”

MATLAB里什么最重要?矩阵。说白了,MATLAB就是为矩阵运算而生的。你想想看,运动控制里的坐标变换、PID参数整定,哪个离得开矩阵?

基本数据类型:

  • 数值型:double(默认)、single、int8/16/32/64。我一般用double,精度够用,计算也快。
  • 字符型:char 和 string。注意,MATLAB里单引号是char,双引号是string,别搞混了。
  • 逻辑型:true/false,常用于条件判断和矩阵索引。
  • 结构体:struct,适合打包管理多个相关变量。比如电机参数:motor.Kt = 0.5; motor.J = 0.01;
  • 元胞数组:cell,可以装不同类型的数据。我在做多轴同步控制时,常用cell存储各轴的参数。

矩阵操作——这是重头戏:

创建矩阵很简单:

A = [1 2 3; 4 5 6; 7 8 9];  % 3x3矩阵
B = zeros(3,4);               % 全零矩阵
C = eye(4);                   % 单位矩阵
D = rand(3,3);                % 随机矩阵

索引和切片是高频操作。我习惯用 end 关键字,省事:

A(2,3)      % 第2行第3列
A(:,2)      % 所有行的第2列
A(1:2,:)    % 前两行所有列
A(end,:)    % 最后一行
避坑指南: 我曾经在写运动学正解时,把矩阵乘法写成了点乘。记住:A*B 是矩阵乘法,A.*B 是对应元素相乘。差一个点,结果天差地别。

矩阵运算常用函数:

函数 说明 示例
size() 获取矩阵维度 [m,n] = size(A)
reshape() 改变矩阵形状 B = reshape(A, 9, 1)
repmat() 复制矩阵 C = repmat(A, 2, 3)
inv() 求逆矩阵 inv(A)
det() 求行列式 det(A)

1.3 脚本与函数编写——从“一次性”到“可复用”

脚本和函数,是MATLAB编程的两大基本形式。我刚开始写代码时,全是脚本,一个文件几百行,改起来想哭。后来我学会了函数,效率翻倍。

脚本(Script):就是按顺序执行的命令集合。适合做一次性计算或快速验证。比如:

% 计算电机转速
V = 24;       % 电压
R = 0.5;      % 电阻
Kt = 0.1;     % 转矩常数
omega = V / (R * Kt);
disp(['转速:', num2str(omega), ' rad/s']);

函数(Function):有输入输出,可重复调用。我建议你把核心算法写成函数,这样调试和维护都方便。

function [omega] = calcMotorSpeed(V, R, Kt)
% 计算直流电机空载转速
% 输入:V-电压,R-电枢电阻,Kt-转矩常数
% 输出:omega-转速(rad/s)
    omega = V / (R * Kt);
end
我的习惯: 每个函数开头都写注释,说明输入输出。别偷懒,三个月后你自己都看不懂当初写的代码。我在项目中吃过这个亏,后来养成了写文档的好习惯。

函数与脚本的区别:

  • 函数有自己的工作区,变量不会污染全局环境。脚本共享工作区。
  • 函数可以递归调用,脚本不行。
  • 函数执行效率更高,因为MATLAB会预编译。

1.4 调试工具的使用——别怕Bug,怕的是不会找Bug

写代码不出Bug?那是不可能的。我写了十几年代码,照样天天跟Bug打交道。关键是,你得会用工具快速定位问题。

MATLAB调试三板斧:

  1. 断点(Breakpoints):在行号旁边点一下,出现红点。运行到这一行会暂停。我一般先在可疑的变量赋值处设断点。
  2. 步进(Step):F10单步执行,F11进入函数内部。配合工作区查看变量值变化。
  3. 条件断点:右键断点,设置触发条件。比如 i == 100,只在循环到第100次时暂停。这个在调试运动控制迭代算法时特别有用。
注意: 调试时别开太多断点,否则会把自己绕晕。我一般一次只设2-3个关键断点,逐步缩小范围。

常用调试命令:

dbstop if error    % 遇到错误自动进入调试模式
dbcont             % 继续执行
dbquit             % 退出调试模式
keyboard           % 在代码中插入调试点,手动输入命令查看变量

我记得有一次调试一个轨迹规划算法,结果一直不对。我用了 keyboard 在循环里暂停,手动打印每一步的中间变量,才发现是角度单位搞错了——用了度,但函数要求弧度。嗯,这种低级错误,谁没犯过呢?

知识体系总览

下面这张图,是我自己总结的本章知识结构。你看一眼,心里就有数了。

MATLAB基础操作回顾 工作区与路径管理 数据类型与矩阵操作 脚本与函数编写 调试工具 clear/load/save addpath/rmpath 创建/索引/切片 矩阵运算函数 脚本 vs 函数 输入输出规范 断点/步进 keyboard/dbstop 打好基础,后续的运动控制实战才能游刃有余

好了,这一章的内容就这些。别看都是基础,但基础不牢,地动山摇。我见过太多工程师,算法写得漂亮,结果卡在矩阵索引这种小问题上。嗯,你先把这些练熟,后面咱们再上硬菜。


公众号:蓝海资料掘金营,微信deep3321