Skip to content

MATLAB - 冒号表示法

冒号 : 是 MATLAB 中最强大和最基本的运算符之一。它用于创建向量、在循环中迭代,最重要的是,用于从矩阵和数组中索引和选择数据子集。掌握其用法是编写高效、简洁和地道的 MATLAB 代码的关键。

冒号运算符提供了创建数字序列的紧凑语法。

  • start:end:创建一个从 start 到 end,默认增量为 1 的向量。
  • start:step:end:创建一个从 start 到 end,指定增量为 step 的向量。
%% 创建一个从 1 到 10 的向量(增量为 1)
v1 = 1:10
% ans = 1 2 3 4 5 6 7 8 9 10
%% 创建一个从 100 递减到 50,步长为 -5 的向量
v2 = 100:-5:50
% ans = 100 95 90 85 80 75 70 65 60 55 50
%% 创建一个从 0 到 pi 的弧度值向量
v3 = 0:pi/4:pi
% ans = 0 0.7854 1.5708 2.3562 3.1416

当您需要在两个值之间获得特定数量的点时,linspace 通常是比冒号运算符更好的选择,以避免浮点数不精确。

% 创建从 0 到 pi 的精确 9 个点
v4 = linspace(0, pi, 9)
% ans = 0 0.3927 0.7854 1.1781 1.5708 1.9635 2.3562 2.7489 3.1416

这是冒号运算符最强大的应用。它允许选择整个行、列或子数组,而无需编写循环。

让我们使用以下矩阵 A 作为示例:

A = [1 2 3 4; 5 6 7 8; 9 10 11 12]
% A =
% 1 2 3 4
% 5 6 7 8
% 9 10 11 12
语法用途示例结果
A(i, :)选择整个第 i 行。A(2, :)[5 6 7 8]
A(:, j)选择整个第 j 列。A(:, 3)[3; 7; 11]
A(r1:r2, c1:c2)选择从行 r1-r2 和列 c1-c2 的子矩阵。A(2:3, 3:4)[7 8; 11 12]
A(:, c1:c2)选择特定列范围内的所有行。A(:, 2:3)[2 3; 6 7; 10 11]
A(end, :)end 关键字指代最后一行或最后一列。A(end, :)[9 10 11 12]
A(:)线性索引:选择所有元素并将其重塑为单个列向量(列优先顺序)。A(1:4)[1; 5; 9; 2]

**向量化(Vectorization)**是使用冒号表示法和其他数组运算符来避免循环的做法,这在 MATLAB 中显著更快且更具可读性。

% 慢速,非惯用方式
for i = 1:100
y(i) = sin(i/10);
end
% 快速,向量化方式
x = 1:100;
y_fast = sin(x/10);

**逻辑索引(Logical Indexing)**是一个相关的概念,您可以使用逻辑数组(包含 true 和 false 值)来对另一个数组进行索引。这对于数据过滤极其强大。

%% 使用之前的矩阵 A
A = [1 2 3 4; 5 6 7 8; 9 10 11 12];
%% 查找矩阵 A 中所有大于 7 的元素
large_elements = A(A > 7)
% ans =
% 9
% 10
% 8
% 11
% 12
%% 将矩阵 A 中所有奇数替换为 0
A(mod(A, 2) == 1) = 0
% A =
% 0 2 0 4
% 0 6 0 8
% 0 10 0 12