
Engineering Notebook // Build Log
/
15:58:23
/NOTEBOOK_ENTRY
关于课堂中matlab运用的学习笔记(week1)持续更新.ing
第一周:MATLAB基础 1.1 定义和计算简单数字 基本算术运算 常用数学函数 1.2 数组操作 创建数组 特殊矩阵 数组索引 1.3 关系和逻辑运算符 关系运算符 逻辑运算符 1.4 基本绘图 二维绘图 其他绘图类型 第二周:MATLAB进阶 2.1 高级数组计算和操作 数组运算 数组操作 统计函数 2.2 脚本和函数 创建脚本文件 .m 创建函数 多输入多输出函数 2.3 循环和结构 For循环 While循环 条件语句 数组预分…
Notebook Time
1 min
Image Frames
1
View Tracks
65
class
FIELD_GUIDE
FIELD GUIDE
Use the guide rail to jump between sections.
第一周:MATLAB基础
1.1 定义和计算简单数字
基本算术运算
% 基本运算符
a = 5;
b = 3;
加法 = a + b; % 8
减法 = a - b; % 2
乘法 = a * b; % 15
除法 = a / b; % 1.6667
幂运算 = a ^ 2; % 25
取余 = mod(a, b); % 2
常用数学函数
% 三角函数
sin_val = sin(pi/2); % 1
cos_val = cos(pi); % -1
tan_val = tan(pi/4); % 1
% 指数和对数
exp_val = exp(1); % 2.7183 (e)
log_val = log(10); % 2.3026 (自然对数)
log10_val = log10(100); % 2 (常用对数)
% 其他常用函数
sqrt_val = sqrt(16); % 4
abs_val = abs(-5); % 5
round_val = round(3.7); % 4
1.2 数组操作
创建数组
% 行向量
row_vector = [1, 2, 3, 4, 5];
% 或者
row_vector = [1 2 3 4 5];
% 列向量
col_vector = [1; 2; 3; 4; 5];
% 使用冒号运算符
range1 = 1:10; % [1, 2, 3, ..., 10]
range2 = 0:0.5:5; % [0, 0.5, 1, 1.5, ..., 5]
% 使用linspace函数
lin_array = linspace(0, 10, 5); % 从0到10生成5个等间距的点
% 创建矩阵
matrix = [1, 2, 3; 4, 5, 6; 7, 8, 9];
特殊矩阵
% 零矩阵
zeros_matrix = zeros(3, 4); % 3x4的零矩阵
% 单位矩阵
ones_matrix = ones(2, 3); % 2x3的全1矩阵
% 单位矩阵
identity = eye(3); % 3x3单位矩阵
% 随机矩阵
rand_matrix = rand(2, 3); % 2x3的随机矩阵(0-1之间)
randn_matrix = randn(2, 3); % 2x3的正态分布随机矩阵
数组索引
A = [1, 2, 3; 4, 5, 6; 7, 8, 9];
% 访问单个元素
element = A(2, 3); % 6 (第2行,第3列)
% 访问整行或整列
row2 = A(2, :); % [4, 5, 6]
col3 = A(:, 3); % [3; 6; 9]
% 访问子矩阵
sub_matrix = A(1:2, 2:3); % [2, 3; 5, 6]
1.3 关系和逻辑运算符
关系运算符
a = 5;
b = 3;
a > b % true (1)
a < b % false (0)
a >= 5 % true (1)
a <= 3 % false (0)
a == 5 % true (1)
a ~= b % true (1) - 不等于
逻辑运算符
% 与 (AND)
result1 = (5 > 3) & (2 < 4); % true
% 或 (OR)
result2 = (5 < 3) | (2 < 4); % true
% 非 (NOT)
result3 = ~(5 > 3); % false
% 数组上的逻辑运算
A = [1, 2, 3, 4, 5];
B = A > 3; % [0, 0, 0, 1, 1]
1.4 基本绘图
二维绘图
% 基本线图
x = 0:0.1:10;
y = sin(x);
plot(x, y);
title('正弦函数');
xlabel('x轴');
ylabel('y轴');
grid on;
% 多条曲线
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
figure;
plot(x, y1, 'r-', x, y2, 'b--');
legend('sin(x)', 'cos(x)');
其他绘图类型
% 散点图
x = rand(1, 50);
y = rand(1, 50);
scatter(x, y);
title('散点图');
% 柱状图
data = [23, 45, 12, 67, 34];
bar(data);
title('柱状图');
% 直方图
data = randn(1000, 1);
histogram(data, 30);
title('直方图');
第二周:MATLAB进阶
2.1 高级数组计算和操作
数组运算
% 逐元素运算
A = [1, 2, 3];
B = [4, 5, 6];
% 逐元素乘法
C = A .* B; % [4, 10, 18]
% 逐元素除法
D = A ./ B; % [0.25, 0.4, 0.5]
% 逐元素幂运算
E = A .^ 2; % [1, 4, 9]
% 矩阵乘法
M1 = [1, 2; 3, 4];
M2 = [5, 6; 7, 8];
M3 = M1 * M2; % 矩阵乘法
数组操作
% 数组拼接
A = [1, 2, 3];
B = [4, 5, 6];
C = [A, B]; % 横向拼接: [1, 2, 3, 4, 5, 6]
D = [A; B]; % 纵向拼接: [1, 2, 3; 4, 5, 6]
% 数组重塑
E = reshape(1:12, 3, 4); % 将1-12排列成3x4矩阵
% 数组转置
F = E';
% 查找元素
G = [1, 5, 3, 9, 2, 7];
indices = find(G > 4); % [2, 4, 6]
统计函数
data = [1, 5, 3, 9, 2, 7];
mean_val = mean(data); % 平均值
median_val = median(data); % 中位数
std_val = std(data); % 标准差
max_val = max(data); % 最大值
min_val = min(data); % 最小值
sum_val = sum(data); % 求和
2.2 脚本和函数
创建脚本文件 (.m)
% 文件名: my_script.m
% 这是一个简单的脚本示例
clc; % 清除命令窗口
clear; % 清除工作区变量
close all; % 关闭所有图形窗口
x = 0:0.1:2*pi;
y = sin(x);
plot(x, y);
title('正弦波');
grid on;
创建函数
% 文件名: calculate_area.m
function area = calculate_area(radius)
% 计算圆的面积
% 输入: radius - 圆的半径
% 输出: area - 圆的面积
area = pi * radius^2;
end
% 调用函数
r = 5;
A = calculate_area(r);
多输入多输出函数
% 文件名: circle_properties.m
function [area, circumference] = circle_properties(radius)
% 计算圆的面积和周长
% 输入: radius - 圆的半径
% 输出: area - 面积, circumference - 周长
area = pi * radius^2;
circumference = 2 * pi * radius;
end
% 调用
[A, C] = circle_properties(5);
2.3 循环和结构
For循环
% 基本for循环
for i = 1:10
disp(i);
end
% 遍历数组
array = [2, 4, 6, 8, 10];
for element = array
disp(element);
end
% 嵌套循环
for i = 1:3
for j = 1:3
fprintf('i=%d, j=%d\n', i, j);
end
end
While循环
% 基本while循环
counter = 1;
while counter <= 10
disp(counter);
counter = counter + 1;
end
% 使用break跳出循环
n = 1;
while true
if n > 5
break;
end
disp(n);
n = n + 1;
end
条件语句
% if-else语句
score = 85;
if score >= 90
grade = 'A';
elseif score >= 80
grade = 'B';
elseif score >= 70
grade = 'C';
else
grade = 'F';
end
% switch语句
day = 3;
switch day
case 1
day_name = '星期一';
case 2
day_name = '星期二';
case 3
day_name = '星期三';
otherwise
day_name = '未知';
end
数组预分配
% 不推荐(效率低)
tic;
for i = 1:10000
slow_array(i) = i^2;
end
time_slow = toc;
% 推荐(预分配,效率高)
tic;
fast_array = zeros(1, 10000);
for i = 1:10000
fast_array(i) = i^2;
end
time_fast = toc;
fprintf('未预分配时间: %.4f秒\n', time_slow);
fprintf('预分配时间: %.4f秒\n', time_fast);
2.4 高级绘图
子图
x = 0:0.1:2*pi;
figure;
% 2x2的子图布局
subplot(2, 2, 1);
plot(x, sin(x));
title('sin(x)');
subplot(2, 2, 2);
plot(x, cos(x));
title('cos(x)');
subplot(2, 2, 3);
plot(x, tan(x));
title('tan(x)');
subplot(2, 2, 4);
plot(x, exp(x));
title('exp(x)');
图形定制
x = 0:0.1:2*pi;
y = sin(x);
figure;
plot(x, y, 'LineWidth', 2, 'Color', [0.8, 0.2, 0.2]);
hold on;
plot(x, cos(x), '--', 'LineWidth', 2, 'Color', 'b');
hold off;
title('三角函数', 'FontSize', 14, 'FontWeight', 'bold');
xlabel('x', 'FontSize', 12);
ylabel('y', 'FontSize', 12);
legend('sin(x)', 'cos(x)', 'Location', 'best');
grid on;
xlim([0, 2*pi]);
ylim([-1.5, 1.5]);
3D绘图
% 3D线图
t = 0:0.1:10*pi;
x = sin(t);
y = cos(t);
z = t;
plot3(x, y, z);
xlabel('X');
ylabel('Y');
zlabel('Z');
title('3D螺旋线');
grid on;
% 3D表面图
[X, Y] = meshgrid(-5:0.5:5, -5:0.5:5);
Z = sin(sqrt(X.^2 + Y.^2));
figure;
surf(X, Y, Z);
colorbar;
title('3D表面图');
xlabel('X');
ylabel('Y');
zlabel('Z');
第三周:文件操作与Simulink
3.1 文件输入/输出 (I/O)
读取文本文件
% 读取整个文件
filename = 'data.txt';
fileID = fopen(filename, 'r');
data = fscanf(fileID, '%f');
fclose(fileID);
% 逐行读取
fileID = fopen(filename, 'r');
line_count = 1;
while ~feof(fileID)
line = fgetl(fileID);
fprintf('第%d行: %s\n', line_count, line);
line_count = line_count + 1;
end
fclose(fileID);
写入文本文件
% 写入数据到文件
filename = 'output.txt';
fileID = fopen(filename, 'w');
fprintf(fileID, '标题: 实验数据\n');
fprintf(fileID, '时间\t温度\n');
for i = 1:10
fprintf(fileID, '%d\t%.2f\n', i, 20 + rand()*10);
end
fclose(fileID);
读写CSV文件
% 写入CSV
data = [1, 2, 3; 4, 5, 6; 7, 8, 9];
csvwrite('data.csv', data);
% 读取CSV
data_read = csvread('data.csv');
% 使用表格(Table)处理CSV
T = table([1; 2; 3], [10; 20; 30], [100; 200; 300], ...
'VariableNames', {'ID', '温度', '压力'});
writetable(T, 'table_data.csv');
% 读取表格
T_read = readtable('table_data.csv');
读写Excel文件
% 写入Excel
data = [1, 2, 3; 4, 5, 6; 7, 8, 9];
xlswrite('data.xlsx', data, 'Sheet1', 'A1');
% 读取Excel
data_read = xlsread('data.xlsx', 'Sheet1', 'A1:C3');
% 使用表格
writetable(T, 'table_data.xlsx', 'Sheet', 'Sheet1');
T_read = readtable('table_data.xlsx', 'Sheet', 'Sheet1');
保存和加载MAT文件
% 保存变量
x = 1:10;
y = sin(x);
save('mydata.mat', 'x', 'y');
% 加载变量
clear;
load('mydata.mat');
% 保存所有变量
save('workspace.mat');
3.2 常用数学技术
数值积分
% 使用trapz进行梯形积分
x = 0:0.01:pi;
y = sin(x);
area = trapz(x, y);
% 使用integral进行自适应积分
f = @(x) sin(x);
area2 = integral(f, 0, pi);
数值微分
% 使用diff计算差分
x = 0:0.1:2*pi;
y = sin(x);
dy = diff(y) ./ diff(x); % 近似导数
% 使用gradient计算梯度
dy2 = gradient(y, x);
求解方程
% 求解线性方程组 Ax = b
A = [3, 2, -1; 2, -2, 4; -1, 0.5, -1];
b = [1; -2; 0];
x = A \ b; % 或者 x = linsolve(A, b);
% 求解非线性方程
f = @(x) x^3 - 2*x - 5;
x0 = 2; % 初始猜测
solution = fzero(f, x0);
曲线拟合
% 多项式拟合
x = 0:0.1:10;
y = 2*x + 3 + randn(size(x)); % 带噪声的线性数据
% 一次多项式拟合
p = polyfit(x, y, 1);
y_fit = polyval(p, x);
figure;
plot(x, y, 'o', x, y_fit, '-');
legend('原始数据', '拟合曲线');
% 使用fit工具箱
ft = fittype('a*x + b');
[fitted_curve, gof] = fit(x', y', ft);
插值
% 原始数据
x = 0:10;
y = sin(x);
% 插值
x_new = 0:0.1:10;
y_interp = interp1(x, y, x_new, 'spline');
figure;
plot(x, y, 'o', x_new, y_interp, '-');
legend('原始数据', '插值曲线');
3.3 Simulink基础
Simulink简介
Simulink是MATLAB的图形化编程环境,用于建模、仿真和分析动态系统。
开始使用Simulink
% 打开Simulink
simulink
% 创建新模型
new_system('my_model');
open_system('my_model');
% 通过命令添加模块(示例)
add_block('simulink/Sources/Sine Wave', 'my_model/Sine');
add_block('simulink/Sinks/Scope', 'my_model/Scope');
add_line('my_model', 'Sine/1', 'Scope/1');
% 运行仿真
sim('my_model');
常用Simulink模块
- Sources(信号源):Sine Wave, Step, Constant, From Workspace
- Sinks(接收器):Scope, To Workspace, Display
- Math Operations(数学运算):Sum, Gain, Product, Abs
- Continuous(连续系统):Integrator, Derivative, Transfer Fcn
- Discrete(离散系统):Discrete-Time Integrator, Unit Delay
Simulink最佳实践
- 使用有意义的模块名称
- 添加注释说明模型功能
- 使用子系统组织复杂模型
- 设置适当的仿真时间和求解器
- 保存信号到工作区进行后续分析
3.4 App Designer
App Designer简介
App Designer是MATLAB中用于创建专业交互式应用程序的开发环境。
创建简单应用
% 打开App Designer
appdesigner
% 或通过命令创建新应用
% 直接在App Designer界面中设计
App Designer组件
- 输入组件:Button, Edit Field, Slider, Knob
- 显示组件:Label, Text Area, Gauge, Lamp
- 绘图组件:UIAxes(用于绘图)
- 容器:Panel, Tab Group, Grid Layout
简单应用示例代码结构
classdef SimpleApp < matlab.apps.AppBase
properties (Access = public)
UIFigure matlab.ui.Figure
UIAxes matlab.ui.control.UIAxes
Button matlab.ui.control.Button
EditField matlab.ui.control.NumericEditField
end
methods (Access = private)
% 按钮回调函数
function ButtonPushed(app, event)
x = 0:0.1:2*pi;
y = sin(app.EditField.Value * x);
plot(app.UIAxes, x, y);
end
end
methods (Access = public)
function app = SimpleApp
% 创建和配置组件
createComponents(app);
registerApp(app, app.UIFigure);
end
end
end
第四周:Arduino与MATLAB集成
4.1 Arduino基础
Arduino简介
Arduino是一个开源电子平台,基于易用的硬件和软件。它可以读取传感器输入并控制执行器输出。
Arduino基本组件
- 数字输入/输出引脚
- 模拟输入引脚
- PWM输出引脚
- 电源引脚(5V, 3.3V, GND)
LED控制基础
// Arduino代码示例(在Arduino IDE中)
void setup() {
pinMode(13, OUTPUT); // 设置引脚13为输出
}
void loop() {
digitalWrite(13, HIGH); // LED亮
delay(1000); // 延时1秒
digitalWrite(13, LOW); // LED灭
delay(1000); // 延时1秒
}
4.2 使用MATLAB控制Arduino
安装MATLAB支持包
% 检查是否安装了Arduino支持包
% 在MATLAB主菜单: 主页 -> 添加功能 -> 搜索"Arduino"
% 安装 "MATLAB Support Package for Arduino Hardware"
连接Arduino
% 创建Arduino对象
a = arduino(); % 自动检测端口
% 或指定端口和板型
a = arduino('COM3', 'Uno'); % Windows
% a = arduino('/dev/ttyUSB0', 'Uno'); % Linux
% 查看可用引脚
a.AvailablePins
数字I/O操作
% LED闪烁示例
a = arduino();
% 设置引脚13为输出
for i = 1:10
writeDigitalPin(a, 'D13', 1); % 点亮LED
pause(0.5);
writeDigitalPin(a, 'D13', 0); % 熄灭LED
pause(0.5);
end
% 读取数字输入
button_state = readDigitalPin(a, 'D2');
模拟I/O操作
% 读取模拟输入(0-1范围)
a = arduino();
voltage = readVoltage(a, 'A0');
% 连续读取并绘图
figure;
for i = 1:100
voltage = readVoltage(a, 'A0');
fprintf('电压: %.2f V\n', voltage);
plot(i, voltage, 'ro');
hold on;
pause(0.1);
end
% PWM输出(模拟输出)
writePWMDutyCycle(a, 'D9', 0.5); % 50%占空比
伺服电机控制
% 控制伺服电机
a = arduino();
s = servo(a, 'D9');
% 设置角度
writePosition(s, 0); % 0度
pause(1);
writePosition(s, 0.5); % 90度
pause(1);
writePosition(s, 1); % 180度
% 清除伺服对象
clear s;
4.3 Arduino传感器数据采集
温度传感器读取示例
a = arduino();
% 读取模拟温度传感器(如LM35)
% LM35输出:10mV/°C
voltage = readVoltage(a, 'A0');
temperature = voltage * 100; % 转换为摄氏度
fprintf('温度: %.2f °C\n', temperature);
实时数据记录
a = arduino();
% 创建数据数组
num_samples = 100;
time_data = zeros(1, num_samples);
sensor_data = zeros(1, num_samples);
% 实时采集和绘图
figure;
h = animatedline;
ax = gca;
ax.YLim = [0 5];
xlabel('样本');
ylabel('电压 (V)');
title('实时传感器数据');
tic;
for i = 1:num_samples
voltage = readVoltage(a, 'A0');
time_data(i) = toc;
sensor_data(i) = voltage;
addpoints(h, i, voltage);
drawnow;
pause(0.05);
end
% 保存数据
save('sensor_data.mat', 'time_data', 'sensor_data');
4.4 LED焊接技巧
焊接安全
- 确保工作区域通风良好
- 使用防护眼镜
- 小心烙铁温度(通常300-350°C)
- 不要触摸烙铁尖端
- 使用烙铁架
焊接步骤
-
准备工作
- 清洁烙铁头
- 准备焊锡丝
- 固定元件
-
焊接过程
- 加热焊盘和元件引脚(2-3秒)
- 添加焊锡丝
- 移开焊锡丝,然后移开烙铁
- 冷却(不要吹气或移动)
-
检查焊点
- 良好焊点:光滑、有光泽、锥形
- 不良焊点:暗淡、多孔、球形
LED焊接注意事项
% LED特性% - 极性:长脚为正极(阳极),短脚为负极(阴极)% 电阻计算
附录
常用MATLAB快捷键
Ctrl + C: 中断运行Ctrl + R: 注释选中行Ctrl + T: 取消注释F9: 运行选中代码F5: 运行整个脚本clc: 清除命令窗口clear: 清除工作区close all: 关闭所有图形窗口
调试技巧
% 设置断点:在代码行前点击或使用dbstop
dbstop in myfunction at 10
% 调试命令
% dbstep - 单步执行
% dbcont - 继续执行
% dbquit - 退出调试
% dbstack - 显示调用栈
% 显示变量
whos % 显示所有变量详细信息
% 代码性能分析
tic;
% 你的代码
elapsed_time = toc;
% 使用profiler
profile on
% 你的代码
profile viewer
常见错误处理
% try-catch语句
try
result = 10 / 0;
catch ME
fprintf('错误: %s\n', ME.message);
end
% 输入验证
function result = safe_divide(a, b)
if b == 0
error('除数不能为零');
end
result = a / b;
end