让你的matlab代码计算速度提升百倍的技巧揭秘

谁都想写出一个高效运行的matlab代码,那么问题来了?如何写出一个

高效运行的matlab代码呢?今天小编就来说道说道。

对于任何一款编程语言来说,提前分配变量的存储空间,对程序运行效率提升是显著的,这对matlab也不例外。对于matlab而言,在编程过程中遇到循环是最拖累代码运行速度的,因此咱们写代码要尽可能地避免循环,将循环尽可能地转化矢量化计算。接下来就根据一个实例来看看,是怎么一步一步实现的吧!

实例1:无任何优化,可能是matlab新手常爱犯的毛病

代码语言:javascript
复制
clear;clc;
num = 4000;
% Step 0: 未作任何优化
tic;
for m = 1:num
    for n = 1:num
       A(m,n) = randn;
       if A(m,n) >= 0
            B(m,n) = sin(A(m,n));
        else
            B(m,n) = cos(A(m,n));
        end
    end
end
toc;

实例2:给变量分配存储空间

代码语言:javascript
复制
clear;clc;
num = 4000;
% Step 1: 预定义A、B,即给A、B预先分配空间
tic;
A = zeros(num);
B = zeros(num);
for m = 1:num
    for n = 1:num
        A(m,n) = randn;
        if A(m,n) >= 0
            B(m,n) = sin(A(m,n));
        else
            B(m,n) = cos(A(m,n));
        end
    end
end
toc;

实例3:直接运用matlab矢量化函数进行赋值

代码语言:javascript
复制
clear;clc;
num = 4000;
% Step 2: rand函数是向量化计算无需在循环中生成,因此可直接向量化生成A
tic;
A = rand(num);
B = zeros(num);
for m = 1:num
    for n = 1:num
        if A(m,n) >= 0
            B(m,n) = sin(A(m,n));
        else
            B(m,n) = cos(A(m,n));
        end
    end
end
toc;

实例4:将循环改为矢量化计算

代码语言:javascript
复制
clear;clc;
num = 4000;
% Step 3: 循环是导致程序运行变慢的根源,能用向量化尽量不要使用循环
tic;
A = rand(num);
B = zeros(num);
B(A>=0) = sin(A(A>=0));
B(A<0)  = cos(A(A<0));
t(4) = toc;

为了更直观地对比优化前后的差异,给出代码运行时间与优化过程变化图,如下:

从上图不难看出,对于矩阵而言,先预分配存储空间推提升程序的运行效率是多么地重要。

最后归纳三点:

a) 矩阵变量不管三七二十一先分配存储空间

b) 可直接矢量化计算的函数不要放在循环中

c) 可以不用循环的代码段就尽量不要用循环

以上就是今天的全部内容,小伙伴们若有更好的建议或意见,欢迎在留言区留下您的足迹!

参考资料:https://weibo.com/1734252803/HF7zw3aLN