MATLAB 是一种向量化编程语言

MATLAB 是一种向量化编程语言。高效使用 MATLAB 的关键在于利用其内置的数据操作能力,而不是依赖循环等结构。


基础数学运算(Basic Math)

大多数算术运算符在向量上都能按预期工作:

>> a = [2 43 943 78];
>> 5 * a
ans = 
    10   215   4715   390

>> a / 2
ans =
    1.0000   21.5000  471.5000   39.0000

>> 0.2 + a
ans =
    2.2000   43.2000  943.2000   78.2000

这些运算同样适用于矩阵,并能得到预期结果。

大多数 MATLAB 函数(如 sinlog)会返回一个与输入维度相同的向量或矩阵。例如,计算从 0 到 10 的整数的正弦值,只需执行:

>> sin(0:10)

返回的结果将是一个包含 11 个值的向量。


每元素运算(Per Element Operations)

像乘方(^)或向量乘法等操作,如果直接使用,在 MATLAB 中可能不会按你期望的那样工作,因为 MATLAB 默认将向量视为矩阵,并执行矩阵乘方或矩阵乘法

要在矩阵或向量的每个元素上执行运算,应在操作符前加点(.),使其变为逐元素操作符

例如,计算从 1 到 4 的整数中,(sin - cos) 的平方差:

>> (sin(1:4) - cos(1:4)).^2
ans =
    0.0907    1.7568    1.2794    0.0106

如果不加点操作,会报错:

>> (sin(1:4) - cos(1:4))^2
??? Error using ==> mpower
Matrix must be square.

因为 MATLAB 试图对一个 1x4 的向量执行矩阵乘方运算,而这在数学上无效。

使用 .*./ 可以实现两个矩阵或向量的逐元素乘法或除法。前提是两个向量的大小必须相同。


将循环转换为向量化计算(Converting Loops to Vector-based Mathematics)

由于 MATLAB 是向量化语言,像下面这种基于循环的写法效率较低:

x = [];
v = [5,2,4,6];
for i = 1:4
   x(i) = v(i) * ((i+32)/2 - sin(pi/2*i));
   if(x(i) < 0)
      x(i) = x(i) + 3;
   end
end

可以使用向量化方法重写为:

i = 1:4;
v = [5,2,4,6];
x = v .* ((i+32)/2 - sin(pi/2*i));
x(x < 0) = x(x < 0) + 3;

内部而言,MATLAB 仍然在进行循环,但是在底层的 C 或 Fortran 实现中完成的,远比你在 MATLAB 脚本中写的 for 循环高效得多。


总之,利用 MATLAB 的向量化运算可以极大提升代码效率和可读性,是进行数值计算时推荐的最佳实践。


Last modified: Tuesday, 15 April 2025, 11:05 AM