MATLAB - 冒号表示法
MATLAB - 冒号 (:) 运算符和索引
Section titled “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 用于精度
Section titled “专业提示:linspace 用于精度”当您需要在两个值之间获得特定数量的点时,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数组和矩阵索引
Section titled “数组和矩阵索引”这是冒号运算符最强大的应用。它允许选择整个行、列或子数组,而无需编写循环。
让我们使用以下矩阵 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] |
最佳实践:向量化和逻辑索引
Section titled “最佳实践:向量化和逻辑索引”**向量化(Vectorization)**是使用冒号表示法和其他数组运算符来避免循环的做法,这在 MATLAB 中显著更快且更具可读性。
% 慢速,非惯用方式for i = 1:100 y(i) = sin(i/10);end
% 快速,向量化方式x = 1:100;y_fast = sin(x/10);**逻辑索引(Logical Indexing)**是一个相关的概念,您可以使用逻辑数组(包含 true 和 false 值)来对另一个数组进行索引。这对于数据过滤极其强大。
%% 使用之前的矩阵 AA = [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 中所有奇数替换为 0A(mod(A, 2) == 1) = 0% A =% 0 2 0 4% 0 6 0 8% 0 10 0 12