heun 方法 matlab代码_MATLAB中代码优化的两种方法

2023-11-06

MATLAB中的代码优化

MATLAB中的代码优化有两种重要的方法:预分配组和向量化循环。

我们举一个简单的例子来看,创建一个MATLAB函数来计算f(x) = sin(x / 100π):

function y = sinfun1(M)
x = 0: M - 1;
for k = 1: numel(x)
y(k) = sin(x(k) / (100 * pi));
end
  • 1

  • 2

  • 3

  • 4

  • 5

这里 我们使用函数timeit来计算调用函数所需的时间。(timeit可用于得到函数调用的可靠的、可重复的时间测量。)

此时我们得到M数量级为20000时的时间测量,如图1所示:

3b7c028ed96762e60f20af34899e1cda.png

图1 函数sinfun1在M=20000的时间测量

我们在编写完函数sinfun1后可以看到MATLAB编辑器给出了一个提示:变量’y’似乎会随迭代次数而改变,请预分配内存以获得更高的运算速度。

为什么会出现这样的情况?那是因为在sinfun1这个函数中,输出变量y每经过一次循环后都会增长一个元素大小,它必须重新分配新的存储空间,并且在每次数组生长时都要复制前一组数组元素。这种频繁的内存重新分配和复制的开销非常大,与sin本身的计算相比需要更多的时间。

此时我们采用预分配数组的办法进行尝试:

预分配组:是指在进入一个计算数组元素的for循环之前,初始化数组。预分配就意味着咋循环开始之前把它初始化为所希望的输出大小。

function y = sinfun2(M)
x = 0: M - 1;
y = zeros(1, numel(x));
for k = 1: numel(x)
y(k) = sin(x(k) / (100 * pi));
end
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

在这里我们使用了zeros生成一个矩阵来预分配存储空间,然后调用timeit计算M=20000时候的时间测量,如图2:

46109608a5e10cceba709d71e5e452f4.png

图1 函数sinfun2在M=20000的时间测量

通过对比可以得出,在M=20000的数量级下,使用预分配数组的办法,要比不使用运行快4倍。接下来我们在M的数量级为200000和2000000下对两种方法进行比较,得出的结果如图3,图4所示:

722bf88aafc21a3aa991960031542839.png

图3 两种方法在M=200000下的时间测量

c44f27afe6245b0d7138ca4cdea260ac.png

图4 两种方法在M=2000000下的时间测量

我们通过计算可以得出,函数sinfun1基本维持了所要求的的时间与M成正比,sinfun2则在数量级到了一定程度后维持正比。另外比较两个函数在200000和2000000下的速度比,可见在这两个数量级下预分配数组的方法大约要比sinfun1快6倍。

向量化循环是指使用矩阵/向量运算符、索引技术和现有的MATLAB或工具箱函数来完全消除循环的一种技术。

我们使用向量化循环对矩阵的输入进行逐元素的操作来消除循环:

function y = sinfun3(M)
x = 0: M - 1;
y = sin(x ./ (100 * pi));
end
  • 1

  • 2

  • 3

  • 4

此时我们再用timit在M=20000时进行时间测量,如图5:b74e9a776137e188d2652b476cd54a5d.png

图5 函数sinfun3在M=20000的时间测量

由图可知我们使用向量化时,在M=20000时要比预分配数组快3倍。接下来测量M的数量级为200000和2000000的时间。如图6所示:5cf7880d9529f7d4203168fd6408d8fd.png

图6 函数sinfun3在M=200000和2000000的时间测量

由此可见,不带循环sinfun3的执行速度和带一个循环的sinfun2的执行速度大致相同,但又略快于sinfun2。在教材中为了为了更好地说明这个比较两种优化方法,给出了下面这个例子。

这个例子是基于公式f(x) = Asin(u0x + v0y)创建一幅合成图像,首先使用嵌套的for循环来计算f:

function f = twodsin1(A, u0, v0, M, N)
%f = zeros(M, N);
for c = 1 : N
v0y = v0 * (c - 1);
for r = 1 : M
u0x = u0 * (r - 1);
f(r, c) = A * sin(u0x + v0y);
end
end
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

不使用预分配和使用后的执行时间如图7所示:ceb4e188c5af926fb29d28385ab48621.png

图7 函数twodsin1使用预分配的前后比较

我们在这里发现使用预分配前后,执行时间的差距并没有很大。接下来来看向量化后的结果。

在实验中使用一个meshgrid的MATLAB函数将函数重写为没有for循环的形式。

function f = twodsin2(A, u0, v0, M, N)
r = 0 : M - 1;
c = 0 : N - 1;
[C, R] = meshgrid(c, r);
f = A * sin(u0 * R + v0 * C);
  • 1

  • 2

  • 3

  • 4

  • 5

继续用timeit测试,得到的结果如图8:46aff04786803ea5b2a783507e8f969c.png

图8 函数twodsin2的时间测量

可见使用向量化后,比使用预分配快了30%,比不使用任何优化方法快了50%。

小结

综合以上两个实验表明,两种代码优化方法(预分配数组和向量化循环)在具体的使用中的差别并不是很大,都可以提升循环运行的速度。我们可以在遇到具体问题后,根据具体情况选择具体的方法:若是循环存在没有预分配内存的问题,那我们可以考虑采用预分配的方法,这样对代码的改动不大,更直观,也更容易表示我们代码得到实际工作机理;若是确定没有预分配的问题,就可以选择向量化循环的办法,这样与基于循环的代码相比,向量化后的代码更易于阅读,更为简洁。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

heun 方法 matlab代码_MATLAB中代码优化的两种方法 的相关文章

  • ANTLR 和 Eclipse(或任何像样的 IDE)

    我已经使用 ANTLRv3IDE 插件在 Eclipse 中使用 ANTLR 一段时间了 虽然它并不完美 而且有点过时 但它的工作相当不错 现在 我希望将我正在创建的另一个 DSL 切换到 ANTLRv4 然而 Eclipse 的支持似乎非
  • 直接从浏览器将文件上传到 Azure Blob 存储?

    是否可以创建一个 html 表单以允许 Web 用户直接将文件上传到 azure blob 存储 而无需使用其他服务器作为中介 S3 和 GAW blobstore 都允许这样做 但我找不到任何对 azure blob 存储的支持 编辑 2
  • Nodejs 一个接一个地运行异步函数

    我是 JS nodejs 的新手 所以如果我不能提出切中要害的问题 请原谅我 所以基本上 如果我有两个异步函数 async function init async function main 如何确保在 init 完成其异步请求后调用 ma
  • facebook php - 如何获取专辑封面照片

    我需要使用 PHP SDK Facebook 获取专辑封面照片 我尝试 https graph facebook com ALBUM ID picture type album 但我得到默认图像 例如 获取用户 https graph fa
  • 将其元素添加到另一个列表后清除列表

    我正在做一个程序 它获取更多句子作为参数 我制作了 2 个列表 一个称为 propozitie 其中包含每个句子 另一个称为 propozitii 其中包含所有句子 问题是 当我在遇到 后清除 propozitie 列表时 它也会清除 pr
  • 如何从尖点库矩阵格式获取原始指针

    我需要从尖点库矩阵格式获取原始指针 例如 cusp coo matrix
  • 利用重力效果拖动元素

    我想完成类似于 photoshop com 和此网站的功能 http mrdoob com projects chromeexperiments google gravity http mrdoob com projects chromee
  • iPhone 中的 NSNotification

    我正在将 NSSNotifcation 发送到 iPhone 应用程序中的另一个视图控制器 但它的观察者方法收到两次通知 这可能如何 任何人都可以指导我 我已经使用此代码来发布通知 NSNotificationCenter defaultC
  • 在合并的单元格中选择、插入照片并将其居中

    我是一名研发面包师 正在为我的团队制作食谱模板 模板中有照片 但我需要轻松地允许他们单击一个按钮 打开照片的文件选择器 然后将该照片放在合并的单元格中 我其实不太擅长做这个 Sub InsertPhotoMacro Dim photoNam
  • Pymongo 批量插入

    我正在尝试批量插入文档 但批量插入时不会插入超过 84 个文档 给我这个错误 in insert pymongo errors InvalidOperation cannot do an empty bulk insert 是否可以批量插入
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • 无法在 Python 2.4 中解码 unicode 字符串

    这是Python 2 4 中的 这是我的情况 我从数据库中提取一个字符串 它包含一个变音的 o xf6 此时 如果我运行 type value 它会返回 str 然后我尝试运行 decode utf 8 但收到错误 utf8 编解码器无法解
  • 自定义字体显示在 IB 中,但不显示在模拟器中

    我已经设置了一个UITextView and a UILabel使用自定义字体 它是垂直镜像的蒙古文字体 但我还添加了英文文本 以便您可以看到效果 这些文字显示在 Interface Builder 中 但在模拟器中大部分字符都在UITex
  • C# amo 获取角色完整

    我正在开发一个 SSAS 项目 其中除其他事项外 我需要获取 C 中表格多维数据集的完整用户列表 目前我让它以这样的方式工作 我可以获得角色 但数据不完整 当我调用 Server Database Roles 为了便于阅读而简化 属性并枚举
  • SQLite HAVING 比较错误

    我有一个测试 SQLite 表 用于存储带有值的报告数据 CREATE TABLE IF NOT EXISTS test fact daily revenue date TEXT revenue NUMERIC product TEXT I
  • AWS SES模板html部分是多行

    我正在使用 AWS SES 按照文档发送电子邮件https docs aws amazon com ses latest DeveloperGuide send personalized email api html https docs
  • 类模板的 C++ 静态成员 - 链接器警告“多重定义”[重复]

    这个问题在这里已经有答案了 假设出于某种原因 我想要一个类模板 MyTemp 和一些静态数据成员 smDummyVar Mytemp h ifndef MY TEMP H define MY TEMP H template
  • 允许使用 SurfaceTexture 在 GLSurfaceView 渲染器中进行多通道渲染

    我正在显示视频GLSurfaceView使用需要连续应用多个着色器的自定义渲染器 目前 它可以成功地使用一个着色器 但我不确定如何扩展渲染管道以连续应用多个着色器 我知道有一些关于应用多个着色器的示例 使用FrameBuffers and
  • 使用 nginx 在云上部署 django 和 React

    我有一个 digitalocean 服务器 并且已经使用 Gunicorn 和 nginx 部署了 Django 后端服务器 如何在同一台服务器上部署 React 应用程序 您可以构建 React 应用程序并使用 Nginx 提供其静态文件
  • WiX Heat:预构建事件在构建服务器上过早触发

    我正在为我的 Visual Studio 解决方案收集一个目录 到目前为止 它在我的本地系统上运行可能是因为项目构建顺序得到了尊重 当我在构建服务器上运行安装程序时 它会找到正确的目录 但在构建安装文件时尚未创建该目录 它抛出一个HEAT5

随机推荐

  • linux搭建 PXE 远程安装服务器及无人值守

    注意 新建虚拟机 cpu 2个 内存不能低于4g 内存不低于20g 否则会失败 步骤 root localhost systemctl stop firewalld service 关闭防火墙 root localhost setenfor
  • 修改mysql的时间/时区

    应用背景 有时候会发现数据库存储的时间与当前所在地区的时间不同 尤其是涉及到全球业务的时候 如果有些程序是根据时间判断来进行后面的逻辑 往db中insert数据发现时间不对 尤其是新DB 可能是mysql设置不对 这时由于时区问题影响存入的
  • 【热门框架】Maven怎样进行版本管理?有哪些需要注意事项?

    Maven的版本管理是指对项目的依赖库和发布版本进行管理 可以通过配置pom xml文件来实现 下面是Maven进行版本管理的一些要点和注意事项 依赖库版本管理 在pom xml文件中 可以通过dependencyManagement元素来
  • java 内存分配策略

    1 对象优先在新生代Eden区中进行分配 当Eden区没有足够空间进行分配时 虚拟机进行一次Minor GC 2 大对象直接进入老年代 所谓大对象就是需要大量连续内存空间的java对象 最典型的大对象就是很长的字符串以及数组 3 长期存活的
  • 汇编指令:左移RL和RLC区别

    转载 https www cnblogs com zhangfan2014 p 4583947 html 汇编指令RL和RLC区别 RL是左移指令 参加左移的是8个位 RLC是带进位位的左移 参加左移的共有9个位 设A 0100 0001
  • 跳点搜索算法 (JPS算法) && 效率优化(摘录)

    摘自 腾讯游戏开发精粹 摘录一次加深记忆方便查找 并未盈利 如有侵权 联系作者删除 如感兴趣 请购买原书支持 谢谢配合 JPS主体思路 表现上 JSP算法比A 快很多 实际上快到哪里了 我们大概了解一下 A 会遍历每一个附近的点 然后把符合
  • 【RTT驱动框架分析07】- adc驱动框架分析+adc中断唤醒adc驱动

    ADC adc应用开发 访问 ADC 设备 应用程序通过 RT Thread 提供的 ADC 设备管理接口来访问 ADC 硬件 相关接口如下所示 函数 描述 rt device find 根据 ADC 设备名称查找设备获取设备句柄 rt a
  • xshell5激活

    xshell5产品秘钥 150105 116578 999990 xftp5产品秘钥 150105 116578 999990 xshell5产品秘钥 101210 450789 147200 xftp5产品秘钥 101210 450789
  • 突发奇想-基于重力感应的人体姿态控制型无人机

    基于重力感应的人体姿态控制型无人机 初级阶段目标 短距离重力感应控制 遥控器重力模块直接连接控制 手持遥控器不平稳问题 最终目标 控制系统迁移至人体 进行直接姿态操作 重力感应 压电效应 当晶体受到固定方向外力作用时 内部产生电极化现象 同
  • [YOLO专题-28]:YOLO V5 代码管理 - 如何与官网协同开发自己的项目代码

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122519479 目录 前言
  • C++数组练习题(一)

    在刚开始学习c 的时候刷了很多基础题 这些基础题比较适合初学C 的码友 所以在学完就立即进行了整理 一是为了让初学C 的码友有所参考 二也是为了复习一下所学过知识 但因为当时在整理时 时间有点紧促 可能会出现一些小错误 于是利用五一假期对之
  • Tensorflow:数据特征值的自变量为离散值

    import pandas as pd from sklearn utils import shuffle dataSet pd read csv input mushrooms csv mapPto1Eto0 p 1 e 0 dataSe
  • vite详解

    vite详解 卖菜的小白的博客 CSDN博客 vite 一 认识vite webpack是目前整个前端使用最多的构建工具 但是除了webpack之后也存在其他一些构建工具 比如说rollup parcel gulp vite等等 vite的
  • Twitter开发者账号申请流程

    文章转自 https www jianshu com p cfb741dd52dd 这篇文章主要介绍在最新的推特开发者平台申请账号的流程 首先需要有一个推特账号 其次该推特账号必须是首次申请 因为推特开发者一个账号只能申请一次 申请后被拒绝
  • 【Streamlit学习心得】个人项目实战,并部署在Streamlit Cloud,生成一个公网url随时访问

    Streamlit学习心得 个人项目实战 并部署在Streamlit Cloud 生成一个公网url随时访问 目录 Streamlit学习心得 个人项目实战 并部署在Streamlit Cloud 生成一个公网url随时访问 前言 一 全局
  • TCP的连接

    一 套接字 1 每一条TCP连接有两个端点 TCP连接的端点叫做套接字 socket 或插口 2 套接字 socket IP地址 端口 例如 套接字 socket 192 168 170 1 80 二 TCP连接 1 建立连接时的三次 握手
  • GPU RayTracing

    参考自 https github com Ubpa ToyRTX 使用三种Texture 记录场景数据 1 SceneData 2 MatData 3 PackData 数据 https docs qq com sheet DQ2FqdE1
  • 秋招准备之——MySQL复习

    秋招复习笔记系列目录 不断更新中 1 数据结构全系列 2 计算机网络知识整理 一 3 计算机网络知识整理 二 4 Java虚拟机知识整理 5 计算机操作系统 6 深入理解HashMap 7 深入理解ConcurrentHashMap 8 M
  • TCP协议格式和特点

    文章目录 1 协议格式 2 协议特性 2 1 面向链接 2 1 1三次握手建立连接 2 1 1四次挥手断开连接 相关问题和知识点 1 握手为啥三次 挥手是四次 2 三次握手失败两端是如何处理的 3 SYN泛洪攻击是怎么回事 4 一台主机上出
  • heun 方法 matlab代码_MATLAB中代码优化的两种方法

    MATLAB中的代码优化 MATLAB中的代码优化有两种重要的方法 预分配组和向量化循环 我们举一个简单的例子来看 创建一个MATLAB函数来计算f x sin x 100 function y sinfun1 M x 0 M 1 for