前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >让你的matlab代码计算速度提升百倍的技巧揭秘

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

作者头像
巴山学长
发布2020-01-14 16:10:37
4.5K0
发布2020-01-14 16:10:37
举报
文章被收录于专栏:巴山学长巴山学长

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 巴山学长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档