MATLAB - 向量
MATLAB - 向量
Section titled “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]访问向量元素(索引)
Section titled “访问向量元素(索引)”您可以使用括号 () 访问和修改向量元素。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]基本向量运算
Section titled “基本向量运算”向量上的运算通常逐元素执行。
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常见错误:* 与 .*
Section titled “常见错误:* 与 .*”初学者最常见的错误是混淆矩阵乘法(*)与逐元素乘法(.*)。
a .* b(逐元素):对应元素相乘。a和b必须具有相同的大小。结果是相同大小的向量。a * b(矩阵乘法):执行线性代数乘法。对于向量,只有当内部维度一致时才定义此操作(例如,row_vec * col_vec是一个标量点积,col_vec * row_vec是一个矩阵外积)。错误地使用这通常会导致“维度不匹配”(dimension mismatch)错误。
实际应用:二维运动学
Section titled “实际应用:二维运动学”向量非常适合表示物理量,如位置、速度和加速度。
% 对象的初始位置和速度向量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);