谁都想写出一个高效运行的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