题目

编写程序,演示典型的“MATLAB 重构思维”:对比传统 C 语言式的 <code>for</code> 循环平方和累加,与向量化单行 <code>sum((1:n).^2)</code> 的写法。讲解解释型脚本中向量化消灭循环的技术动机。

输入格式:无需外部输入。

输出格式:展示两种写法计算 $\sum_{k=1}^{100} k^2$ 的结果一致性。

数据范围与约定:循环消除重构。

思路与算法

1. 脚本语言循环瓶颈
在 Octave / MATLAB 等动态解释型语言中,每一个 for 循环每迭代一步都会触发变量类型推导、范围越界判定与解释器栈调度开销,在大规模计算时严重拖慢性能。

2. 向量化下沉至 C/底层库
当使用 (1:n).^2 时,是在 C/Fortran 编译优化后的连续内存块中直接跑底层汇编循环,消除了所有解释器层开销。

3. 公式闭式解
对于平方和,数学上甚至存在闭式解析解 $\frac{n(n+1)(2n+1)}{6}$,能直接在 $O(1)$ 时间内完成。

完整程序

% Octave / MATLAB 第58题:向量化重构消除累加循环
n = 100;

% 传统循环写法 (不推荐)
sum_loop = 0;
for k = 1:n
    sum_loop = sum_loop + k^2;
end

% 现代向量化写法 (标准推荐)
sum_vec = sum((1:n) .^ 2);

% 数学公式解析解 O(1)
sum_formula = n * (n + 1) * (2 * n + 1) / 6;

fprintf("计算 1^2 + 2^2 + ... + 100^2:\n");
fprintf("for 循环求得:    %d\n", sum_loop);
fprintf("向量化 sum 求得: %d\n", sum_vec);
fprintf("数学解析公式:    %d\n", sum_formula);

运行示例

输出:

计算 1^2 + 2^2 + ... + 100^2:
for 循环求得:    338350
向量化 sum 求得: 338350
数学解析公式:    338350