Skip to content

MATLAB - 向量

在 MATLAB 中,向量(Vector)是一个一维数字数组。由于 MATLAB 是 “Matrix Laboratory”(矩阵实验室)的缩写,向量是几乎所有数据操作的基本构建块。通过一个称为向量化(Vectorization)的强大概念,理解向量是编写高效、可读且符合 MATLAB 习惯的代码的关键。

MATLAB 支持两种类型的向量:

  • 行向量(Row Vectors):一个 1xN 数组。
  • 列向量(Column Vectors):一个 Nx1 数组。

行向量通过将元素用方括号 [] 括起来,并用空格或逗号分隔来创建。

% 行向量
row_vec = [7 8 9 10 11]
% 或另一种方式
% row_vec = [7, 8, 9, 10, 11]

列向量的创建方式类似,但元素之间用分号 ; 分隔。

% 列向量
col_vec = [7; 8; 9; 10; 11]

更常见的是使用函数创建向量:

% 冒号运算符,用于等间距元素(步长为 1)
v1 = 1:5 % 结果:[1 2 3 4 5]
% 带有指定步长的冒号运算符
v2 = 0:0.5:2 % 结果:[0 0.5 1.0 1.5 2.0]
% `linspace` 用于指定数量的点
v3 = linspace(0, 10, 5) % 0 到 10 之间的 5 个点。结果:[0 2.5 5 7.5 10]
% 预分配一个全零向量(有利于性能)
v4 = zeros(1, 4) % 结果:[0 0 0 0]

您可以使用括号 () 访问和修改向量元素。MATLAB 索引从 1 开始。

v = [10 20 30 40 50];
% 访问第三个元素
elem3 = v(3) % 结果:30
% 使用 'end' 关键字访问最后一个元素
last_elem = v(end) % 结果:50
% 访问一系列元素(一个“切片”)
sub_vec = v(2:4) % 结果:[20 30 40]
% 访问非连续元素
non_contig = v([1 4]) % 结果:[10 40]
% 修改元素
v(1) = 99; % v 现在是 [99 20 30 40 50]

一个强大的功能是根据逻辑条件访问元素。这是向量化的基石。

v = [10 20 30 40 50];
% 查找所有大于 25 的元素
large_vals = v(v > 25) % 结果:[30 40 50]

向量上的运算通常逐元素执行。

a = [1 2 3];
b = [4 5 6];
% 加法和减法(向量必须大小相同)
sum_vec = a + b % 结果:[5 7 9]
diff_vec = b - a % 结果:[3 3 3]
% 标量乘法
scaled_vec = a * 3 % 结果:[3 6 9]
% 逐元素乘法(注意点:.*)
% 这不是点积。
elem_prod = a .* b % 结果:[1*4, 2*5, 3*6] -> [4 10 18]
% 转置(将行转换为列,反之亦然)
col_a = a' % 结果:一个 3x1 列向量
% 向量追加(拼接)
horz_cat = [a, b] % 结果:[1 2 3 4 5 6]
vert_cat = [a'; b'] % 结果:一个 6x1 列向量
% 向量幅值(欧几里得范数)
mag = norm(a) % 结果:sqrt(1^2 + 2^2 + 3^2) -> sqrt(14)
% 点积
dp = dot(a, b) % 结果:1*4 + 2*5 + 3*6 -> 32

初学者最常见的错误是混淆矩阵乘法(*)与逐元素乘法(.*)。

  • a .* b(逐元素):对应元素相乘。a 和 b 必须具有相同的大小。结果是相同大小的向量。
  • a * b(矩阵乘法):执行线性代数乘法。对于向量,只有当内部维度一致时才定义此操作(例如,row_vec * col_vec 是一个标量点积,col_vec * row_vec 是一个矩阵外积)。错误地使用这通常会导致“维度不匹配”(dimension mismatch)错误。

向量非常适合表示物理量,如位置、速度和加速度。

% 对象的初始位置和速度向量
pos0 = [10, 20]; % (x, y) 位置,单位米
vel = [5, -2]; % (vx, vy) 速度,单位米/秒
% 经过时间
dt = 2; % 秒
% 使用向量加法计算新位置
pos1 = pos0 + vel * dt;
fprintf('New position is (%.1f, %.1f) meters.\n', pos1(1), pos1(2));
% 计算速度(速度向量的幅值)
speed = norm(vel);
fprintf('Speed is %.2f m/s.\n', speed);