MATLAB基础版:百万次重复矩阵运算的提速方法咨询
基础版MATLAB下的提速方案
针对百万次循环中A.' * B运算耗时占比最高的问题,基础版MATLAB里可以从以下几个方向优化:
1. 强制预分配输出内存
当前循环中result(i)的动态赋值会不断触发内存扩容,百万次循环下这部分开销不可忽视。提前给result分配好固定内存:
result = zeros(N, 1); % 预先分配N×1的零矩阵
2. 彻底消除循环:向量化生成所有A矩阵
这是最有效的提速手段——如果能修改func_temp,让它一次性生成所有N次循环需要的A矩阵(输出为9000×N的矩阵),就能把百万次小矩阵乘法合并成一次大矩阵运算:
A_all = func_temp(1:N); % 修改func_temp,返回9000×N的矩阵 sum_temp_all = A_all.' * B; % 一次运算得到N×1000的sum_temp结果集
MATLAB底层的BLAS库对大矩阵乘法有极致优化,这种合并运算的速度会比循环快几个数量级。如果func_temp无法直接修改成批量输出,也可以用arrayfun批量生成所有A再拼接成矩阵:
A_cell = arrayfun(@func_temp, 1:N, 'UniformOutput', false); A_all = cell2mat(A_cell);
但优先修改func_temp本身,拼接操作会有额外开销。
3. 降低精度减少运算负载
如果你的计算对精度要求不高,把A和B转换成单精度类型(single),单精度运算的速度是双精度的2倍左右,同时内存占用减半,能大幅减少数据读写开销:
B = single(B); % 在生成A时也直接用单精度,比如func_temp里输出single类型
4. 避免循环内的冗余操作
把循环内对sum_temp的多项操作,尽量改成向量化批量处理。比如在得到sum_temp_all后,一次性对整个N×1000矩阵执行所有操作,再生成最终的result,不要在循环里逐次处理单个sum_temp。
5. 确保JIT编译器正常工作
MATLAB的JIT编译器会对循环做优化,要避免在循环内使用eval、动态变量名(比如result_ + num2str(i))、改变变量类型等会让JIT失效的操作,保证循环代码能被JIT优化。
内容的提问来源于stack exchange,提问作者RajaKrishnappa
相关产品推荐
相关产品推荐

