Learn in 10 minutes

Learn in 10 minutes

10分钟学会MATLAB

编程语言

MATLAB(Matrix Laboratory)是一种专为数值计算、算法开发和数据可视化设计的高级编程语言和环境。MATLAB 最早开发于 20 世纪 70 年代末,如今已成为工程、科学和数学领域不可或缺的工具。

通过本教程,你将掌握 MATLAB 的基础知识,并开始使用这个强大的计算环境。

1. 你的第一个 MATLAB 程序

创建一个名为 hello.m 的脚本文件,或者直接在 MATLAB 命令窗口中输入命令:

disp('Hello, World!')

也可以使用 fprintf 函数:

fprintf('Hello, World!\n')

输出结果为:

Hello, World!

disp() 函数直接显示内容,而 fprintf() 则提供更灵活的格式化控制,类似于 C 语言的 printf。

2. 基础语法

MATLAB 有自己的语法规则,与大多数通用编程语言有所不同。理解这些基础知识对于编写清晰、可维护的代码至关重要。

2.1 注释

单行注释以百分号 % 开头:

% 这是一条注释
x = 10;  % 将 10 赋值给 x

多行注释使用 %{%}

%{
这是一条多行注释。
它可以跨越多行。
%}

2.2 分号

分号 ; 用于抑制输出显示。没有分号时,MATLAB 会显示计算结果:

x = 5     % 显示: x = 5
y = 10;   % 不显示输出,但 y 已被赋值

2.3 大小写敏感

MATLAB 对大小写敏感。Aa 是不同的变量:

A = 5;
a = 10;
disp(A)  % 输出: 5
disp(a)  % 输出: 10

2.4 变量命名

变量名必须以字母开头,后面可以是字母、数字或下划线:

valid_name = 1;
another_valid_name_123 = 2;
% 123invalid = 3;  % 错误:不能以数字开头

2.5 基本运算

MATLAB 在矩阵运算方面表现出色。创建矩阵非常简单:

A = [1 2 3; 4 5 6; 7 8 9]  % 3x3 矩阵

输出:

A =

     1     2     3
     4     5     6
     7     8     9

3. 变量和数据类型

MATLAB 使用动态类型系统。变量在赋值时创建,其类型由赋值的值决定。

3.1 数值类型

MATLAB 默认将所有数字存储为双精度浮点数:

% 整数
int_num = 42;

% 浮点数
float_num = 3.14159;

% 科学计数法
sci_num = 2.5e-3;  % 0.0025

3.2 字符串

字符串变量使用单引号:

str = 'Hello, MATLAB';
str2 = "Hello, MATLAB";  % 字符串数组 (R2016b+)

字符串拼接:

str1 = 'Hello';
str2 = 'World';
combined = [str1 ', ' str2];  % 'Hello, World'

3.3 逻辑值(布尔值)

逻辑值为 truefalse

flag = true;
result = false;

% 逻辑运算
a = true;
b = false;
and_result = a && b;    % false
or_result = a || b;     % true
not_result = ~a;        % false

3.4 字符数组与字符串

MATLAB 同时包含字符数组和字符串对象:

% 字符数组(旧式写法)
char_arr = 'Hello';

% 字符串对象(现代写法,R2016b+)
str_obj = "Hello";

% 字符串对象使用起来更方便
name = "Alice";
greeting = "Hello, " + name;  % 自然地实现拼接

4. 数据结构

MATLAB 提供了多种数据结构以满足不同的使用场景。

4.1 向量

向量是一维数组:

% 行向量
row_vec = [1 2 3 4 5];

% 列向量
col_vec = [1; 2; 3; 4; 5];

% 使用冒号运算符
range_vec = 1:5;        % [1 2 3 4 5]
step_vec = 0:2:10;      % [0 2 4 6 8 10]

% linspace 用于创建等间距值
lin_vec = linspace(0, 10, 5);  % [0 2.5 5 7.5 10]

4.2 矩阵

矩阵是 MATLAB 的基础:

% 直接创建矩阵
A = [1 2 3; 4 5 6; 7 8 9];

% 访问元素
element = A(2, 3);  % 返回 6(第2行第3列)

% 矩阵运算
B = A';            % 转置
C = A * B;         % 矩阵乘法
D = A .* B;        % 元素级乘法

4.3 元胞数组

元胞数组可以存储不同类型的数据:

% 创建元胞数组
cell_arr = {1, 'hello', [1 2 3], true};

% 使用花括号访问元胞内容
data = cell_arr{2};  % 返回 'hello'

% 使用圆括号访问元胞
sub_cell = cell_arr(1:2);  % 返回 {1, 'hello'}

4.4 结构体

结构体就像带有命名字段的字典:

% 创建结构体
student.name = 'John';
student.age = 20;
student.major = 'Engineering';

% 访问字段
disp(student.name);  % 输出: John

% 结构体数组
students(1).name = 'Alice';
students(1).age = 21;
students(2).name = 'Bob';
students(2).age = 22;

4.5 表格

表格适用于表格数据:

% 创建表格
Age = [25; 30; 35];
Name = {'Alice'; 'Bob'; 'Charlie'};
Salary = [50000; 60000; 70000];

T = table(Name, Age, Salary);

% 访问数据
disp(T.Age);
disp(T.Name{1});

5. 运算符

MATLAB 提供了各种算术、比较和逻辑运算符。

5.1 算术运算符

a = 10;
b = 3;

sum = a + b;           % 13
diff = a - b;          % 7
prod = a * b;          % 30
quot = a / b;          % 3.3333
int_div = floor(a/b);  % 3
mod = mod(a, b);       % 1(余数)
pow = a ^ b;           % 1000

5.2 元素级运算符

元素级运算符对相应元素进行操作:

A = [1 2 3];
B = [4 5 6];

C = A .* B;  % 元素级乘法: [4 10 18]
D = A.^2;    % 元素级平方: [1 4 9]

5.3 比较运算符

x = 5;
y = 10;

eq = (x == y);    % false
neq = (x ~= y);   % true
gt = (x > y);     % false
lt = (x < y);     % true
ge = (x >= y);    % false
le = (x <= y);    % true

5.4 逻辑运算符

a = true;
b = false;

and_op = a & b;     % false(元素级与)
or_op = a | b;      % true(元素级或)
not_op = ~a;        % false
and_short = a && b; % false(短路与)
or_short = a || b;  % true(短路或)

6. 控制流

MATLAB 提供了标准的控制流结构,但语法与 Python 等语言有所不同。

6.1 if-elseif-else

score = 85;

if score >= 90
    grade = 'A';
elseif score >= 80
    grade = 'B';
elseif score >= 70
    grade = 'C';
else
    grade = 'F';
end

disp(grade)  % 输出: B

6.2 switch

switch 语句将单个表达式与多个情况进行比较:

day = 'Monday';

switch day
    case {'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'}
        disp('Weekday');
    case {'Saturday', 'Sunday'}
        disp('Weekend');
    otherwise
        disp('Invalid day');
end

6.3 for 循环

for 循环遍历一个范围或数组:

% 遍历一个范围
for i = 1:5
    disp(i);
end

% 遍历数组
fruits = {'apple', 'banana', 'orange'};
for fruit = fruits
    disp(fruit{1});
end

% 嵌套循环用于矩阵运算
A = [1 2; 3 4];
B = zeros(2, 2);
for i = 1:2
    for j = 1:2
        B(i, j) = A(i, j) * 2;
    end
end

6.4 while 循环

count = 0;
while count < 5
    disp(count);
    count = count + 1;
end

6.5 循环控制

break 语句退出循环,continue 跳到下一次迭代:

% 使用 break
for i = 1:10
    if i == 5
        break;
    end
    disp(i);
end
% 输出: 1 2 3 4

% 使用 continue
for i = 1:5
    if mod(i, 2) == 0
        continue;  % 跳过偶数
    end
    disp(i);
end
% 输出: 1 3 5

7. 输入和输出

7.1 用户输入

使用 input() 函数获取用户输入:

% 获取数值输入
num = input('Enter a number: ');

% 获取字符串输入
name = input('Enter your name: ', 's');

% 获取表达式输入(会计算输入的值)
expr = input('Enter an expression: ');

7.2 显示输出

有几个函数可以显示输出:

% disp - 简单显示
disp('Hello');
disp([1 2 3]);

% fprintf - 格式化输出
name = 'Alice';
age = 25;
fprintf('Name: %s, Age: %d\n', name, age);

% sprintf - 创建格式化字符串
str = sprintf('Value: %.2f', 3.14159);
disp(str);

7.3 格式化说明符

MATLAB 中常用的格式化说明符:

% %s - 字符串
% %d - 整数
% %f - 浮点数
% %.2f - 保留2位小数的浮点数
% %e - 科学计数法

fprintf('%d %.2f %e\n', 42, 3.14159, 1000)
% 输出: 42 3.14 1.000000e+03

8. 函数

MATLAB 中的函数通常定义在单独的文件中,但匿名函数提供了内联创建函数的方式。

8.1 匿名函数

匿名函数可以创建简单函数,无需单独的文件:

% 单个输入
square = @(x) x^2;
disp(square(5));  % 输出: 25

% 多个输入
add = @(x, y) x + y;
disp(add(3, 4));  % 输出: 7

% 多个表达式
hypot = @(x, y) sqrt(x^2 + y^2);
disp(hypot(3, 4));  % 输出: 5

8.2 函数文件

创建一个名为 myfunc.m 的文件:

function y = myfunc(x)
    y = x^2 + 1;
end

调用该函数:

result = myfunc(5);  % 输出: 26

8.3 多输出函数

function [sum, prod] = calc(x, y)
    sum = x + y;
    prod = x * y;
end

调用多输出函数:

[s, p] = calc(3, 4);
disp(s);  % 7
disp(p);  % 12

8.4 可变参数

使用 vararginvarargout 处理可变数量的参数:

function result = sum_all(varargin)
    result = 0;
    for i = 1:length(varargin)
        result = result + varargin{i};
    end
end

% 可以传入任意数量的参数
total = sum_all(1, 2, 3, 4, 5);  % 输出: 15

9. 脚本文件

脚本是包含一系列 MATLAB 命令的 .m 文件。它们对工作空间中的数据进行操作:

% 保存为 myscript.m
% 计算数据集的统计信息
data = [1 2 3 4 5 6 7 8 9 10];

mean_val = mean(data);
std_val = std(data);
max_val = max(data);
min_val = min(data);

fprintf('Mean: %.2f\n', mean_val);
fprintf('Std: %.2f\n', std_val);
fprintf('Max: %d\n', max_val);
fprintf('Min: %d\n', min_val);

10. 错误处理

使用 try-catch 进行错误处理:

try
    result = risky_operation();
catch ME
    fprintf('Error: %s\n', ME.message);
    % 处理错误
    result = 0;
end

使用 error() 抛出错误:

function result = divide(a, b)
    if b == 0
        error('Division by zero is not allowed');
    end
    result = a / b;
end

11. 文件操作

11.1 保存和加载数据

% 将变量保存到文件
x = [1 2 3];
y = 'hello';
save('data.mat', 'x', 'y');

% 从文件加载变量
load('data.mat');

% 保存到文本文件
writematrix(x, 'data.txt');

% 从文本文件读取
data = readmatrix('data.txt');

11.2 文本文件操作

% 写入文本文件
fid = fopen('output.txt', 'w');
fprintf(fid, 'Line 1\n');
fprintf(fid, 'Line 2\n');
fclose(fid);

% 读取文本文件
fid = fopen('output.txt', 'r');
while ~feof(fid)
    line = fgetl(fid);
    if ischar(line)
        disp(line);
    end
end
fclose(fid);

使用 textscan 进行结构化读取:

fid = fopen('data.txt', 'r');
format = '%s %d %f';
C = textscan(fid, format);
fclose(fid);

name = C{1};
age = C{2};
score = C{3};

12. 绘图

MATLAB 的绘图功能是其最强大的特性之一。

12.1 基础二维绘图

x = 0:0.1:2*pi;
y = sin(x);

plot(x, y);
xlabel('x');
ylabel('sin(x)');
title('Sine Wave');
grid on;

12.2 多子图

x = 0:0.1:2*pi;

% 子图
subplot(2, 1, 1);
plot(x, sin(x));
title('Sine');

subplot(2, 1, 2);
plot(x, cos(x));
title('Cosine');

12.3 图表自定义

x = 0:0.1:10;
y1 = x;
y2 = x.^2;

plot(x, y1, 'b-', 'LineWidth', 2);  % 蓝色实线
hold on;
plot(x, y2, 'r--', 'LineWidth', 2); % 红色虚线
hold off;

xlabel('X');
ylabel('Y');
legend('Linear', 'Quadratic');
title('Linear vs Quadratic');
grid on;

12.4 其他图表类型

% 条形图
bar([1 2 3 4], [10 20 15 25]);

% 直方图
data = randn(1000, 1);
histogram(data, 30);

% 散点图
x = rand(100, 1);
y = 2*x + randn(100, 1)*0.1;
scatter(x, y);