前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Tuning MATLAB code

Tuning MATLAB code

作者头像
宋彦
修改于 2019-07-04 09:59:28
修改于 2019-07-04 09:59:28
39700
代码可运行
举报
文章被收录于专栏:一点ECON一点ECON
运行总次数:0
代码可运行

一晃几个月过去了,更新的有点慢

,但是还是会继续写下去的

以后的内容可能会更加多元一点,不只是STATA的使用技巧,会加入MATLAB,PythonGit等其他编程语言或者工具的总结

写高效率的MATLAb code和写英文文章的最核心,最重要的思路是完全一样的: 不要重复 (avoid redundancy). 做到了这一点,代码的效率会得到保障,也能让读者更好的理解自己英文文章的目的。

这一个简单思路之所以如此重要是因为大部分MATLAB code的bottleneck都是重复次数非常多的for loop, 而for loop中即使一个很小的计算,在几万次的重复下也会对整体程序的效率起到很大的影响。因此,写好MATLAB code的关键就是如何避免重复计算。基于这点思路,下面具体介绍三类如何避免重复计算的方法

Move loop-invariant code out of the loop

如果一个计算在每次loop时不发生变化,那么这个计算就应该被调整到for loop之外。这个思路虽然简单,但是有的时候并不是特别容易发现重复的计算,特别是这个计算是在另外一个函数中进行时。 下面举例说明:

'''

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for loopIDX = 1:1000    array =1:100;    
process(array,loopIDX);endfunction process(array, loopIDX)    
arrayLen = length(array);    for arrayIDX =1:arrayLen        
doSomething(arrary(arrayIDX),loopIDX);    
endend

''' 这里的redundancy不是特别容易发现,arrayLen是在 process 函数里面计算的,但是这个变量不会因为loopIDX的改变而变化, 因此不需要重复计算。 优化后的代码如下

'''

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array =1:100;      
arrayLen = length(array);for loopIDX = 1:1000    
process(array,arrayLen,loopIDX);endfunction process(array,arrayLen,loopIDX)    
for arrayIDX =1:arrayLen        
doSomething(arrary(arrayIDX),loopIDX);    
endend

'''

Minimize Dereferencing

不仅是不必要的计算需要尽量减少,其他一切会消耗计算时间的代码都需要优化。这里面就包括了:overhead of calling function and referencing. 每次call function和指代矩阵元素,不仅是函数计算和矩阵运算会耗费时间,而且会有额外的overhead的成本。 下面举例说明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    a = [0,0];    for idx =1:1e8        a(2)=a(2)+idx;    end

    a = [0,0];    b = 0;    for idx =1:1e8        b = b +idx;    end    a(2) = b;

这几行代码只是对a(2)进行一个累计的加总,但是第一种方法由于每个loop里面都需要进行通过index找到a(2)具体值的计算,而第二种方法通过使用一个temporary variable b,避免了每次的索引运算,可以将运算时间从0.9秒缩短到0.5秒。

Vectorization

作为一个矩阵运算语言,MATLAB进行矩阵计算通常比通过for loop进行计算要更有效率,因此使用矩阵语言代替for loop通常能够节约计算时间,这种方法被统称为vectorization。下面,我们举一个例子,来介绍vectorization的思路。

假设,我们有一个班级的学生成绩,以vector form储存。我们需要在这些学生中抽出4人组成一个小组,得到一个储存了每种可能的矩阵,每行对应抽中学生的成绩。 下面代码可以通过for loop来实现这一目的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ticdata = rand(5,1);for i =1:1e5    
c_mod = nchoosek(1:5,3);    
exp_cbnt = zeros(size(c_mod, 1), 3);    
exp_cbnt(:,1) = data(c_mod(:,1),1);    
for k = 2:3        
exp_cbnt(:,k) = data(c_mod(:,k),1);    
endendtoc 

使用vectorization的方法如下。这里的思路是先计算最终需要得到的矩阵的row vector form (one dimension),再通过reshape得到最终的目标矩阵。 使用vectorization的方法会比第一种for loop的方法节约大概百分之十的计算时间,loop次数越多节约的时间会越明显。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ticfor i =1:1e5    
c_mod = nchoosek(1:5,3);    
c_mod_length = size(c_mod, 1);    
c_mod_vec = reshape(c_mod,c_mod_length*3,1);    
exp_cbnt_vec  = data(c_mod_vec,1);    
exp_cbnt_b = reshape(exp_cbnt_vec,c_mod_length,3);endtoc 
isequal(exp_cbnt,exp_cbnt_b)

Vectorization的方法还有很多,这里无法一一列举,但是重要的是当我们看到for loop时,应该立刻去想是不是有可能用矩阵的方法来表达,然后再测试对比两种方法所花的时间.Matlab已经能够对for loop进行非常高效的优化了,所以并不是vectorization一定会节约时间。

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

本文分享自 一点ECON 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
【HomeKit】从HomeKit架构层细化到HomeKit ADK集成
此配置文件用于控制启用Airplay的电视,并需要AirPlay视频SDK来构建AirPlay共享键存储库和MFi软件身份验证示例。ADK公开了一个PAL API,AirPlayTEE,以启用与AirPlay共享密钥存储的集成。这使得将Ed25519长期密钥、设备ID和AirPlay和HomeKit之间共享的配对存储在一个单独的可信执行环境中。所提供的示例假设AirPlay视频公开了一个插座机制和一个回调机制,允许HomeKit电视与AirPlay视频通信。通信机制用于更新HomeKit能够更改的配置,例如电视的配置名称。SDK示例提供了一个通过命令行与电视服务和特征进行交互的接口。这在开发和测试过程中很有用。
天天Lotay
2023/03/16
2.5K0
【HomeKit】从HomeKit架构层细化到HomeKit ADK集成
一份写给极客的智能家居指南
无论怎样,先上成果啦——我花了一个小时拍的 23 秒视频~~ 我的智能家居方案,系统架构图如下所示: 方案简介 使用 Home Assistant、HomeBridge 作为智能家居的核心 使用 A
Phodal
2018/01/29
2.3K1
Infuse for Mac(高品质媒体播放器)
Infuse是一款非常流行的媒体播放器应用程序,它支持广泛的视频格式,包括MP4、MKV、AVI、WMV等,并提供高品质的解码功能,支持4K、HDR和Dolby Vision等高清视频特性。
快乐的小丸子
2023/04/11
1.7K0
Homekit.Net 1.0.0发布:.NET原生SDK,助力打造私人智能家居新体验
hi 大家好,我是三合,作为一个非著名懒人,每天上完班回到家,瘫在沙发上一动都不想动,去开个灯我都嫌累,此时,智能家居拯救了我,只需要在手机点点点,开关灯,空调,窗帘就都搞定了,一开始我用的是开源的home assistan,俗称HA,搭配上hass-xiaomi-miot以及hap-python这几个插件,就可以将米家的智能家居设备接入苹果的homekit生态,整体而言在苹果手机上使用体验非常好,但是有一个致命的问题,每隔一段时间,米家的设备在homekit上就会失效,需要我重置,为此没少被老婆埋怨这智能家居怎么这么难用,然后ha又是python写的,说句实话,我不太喜欢这种动态语言,各种奇怪用法,看得我云里雾里,更谈不上调试了,此时我就在想,如果我用c#写homeKit和米家的sdk,自己搞一个智能家居,岂不美哉,毕竟有了原生api,那就有了无限可能。
郑子铭
2024/05/08
1820
Homekit.Net 1.0.0发布:.NET原生SDK,助力打造私人智能家居新体验
苹果认证MFI学习
MFi包含一系列技术或标准,你所开发的配件,要符合这个标准,才能够苹果设备如手机所认可,才能得到授权在市场销售。
天天Lotay
2023/03/01
3.6K0
苹果认证MFI学习
可视门铃、wifi连体衣:苹果的智能家居野心
选文教对|Selene Wang 翻译|冯琛 ◆ ◆ ◆ 导读 在昏暗的主卧室中,David Kaiserman身穿衬衫,站在双人床边。“Siri,早上好!”他对手中的iPad说道,这时屋里的灯亮了,百叶窗缓缓拉开。 “您的家已经充满阳光,”虚拟助理回答道。 在这个加州阿拉尼达市(Alameda)的四室房子中,美国莱纳房屋公司(Lennar Corp.)技术部总监Kaiserman正在用iPhone或iPad操控家中的一切。 点击你的手机,AC/DC乐队的“回到黑暗(Back in Black)”音乐响
大数据文摘
2018/05/25
5780
Infuse for Mac(音视频播放器) 7.5.1中文免激活版
Infuse是一款多媒体播放器应用,它支持播放多种格式的视频文件、音频文件和图片文件,并且可以通过AIrPlay将媒体内容投放到其他设备上。Infuse还支持在线视频流媒体播放和本地网络共享,用户可以通过它来访问家庭网络上的媒体文件。
一小朵
2023/03/28
2.9K0
Infuse for Mac(音视频播放器) 7.5.1中文免激活版
Apple主推的智能家居是什么、怎么用?一篇文章带你从零完全入门 HomeKit
如果你对智能家居有所了解,那应该或多或少听人聊起过 HomeKit。由 Apple 开发并主推的的 HomeKit 既因为产品选择少、价格高而难以成为主流,又因其独特的优秀体验和「出身名门」而成为智能家居领域的焦点。HomeKit 究竟是什么?能做什么?怎么做到的?
天天Lotay
2023/03/01
2K0
Apple主推的智能家居是什么、怎么用?一篇文章带你从零完全入门 HomeKit
Hey Siri,要怎样你才肯帮我开灯?
本文首发钛媒体@糖直销_Orz 当我们能够躺在床上:“hey Siri,帮我关下灯”,这才是更实用的使用姿势。实际上,这也是苹果对 Siri 的期望。 要说起智能家居类应用,我们都会想起亚马逊 Echo。“Alexa,帮我关个灯。”“Alexa,我锁门了没有?”这些事情,都无需自己动手,仅靠语音就能解决,未来也会有越来越多的电器接入到这一生态系统中。 然而,对于大多数人而言,Echo 智能音箱虽然能提供便利,但大多数情况下,依然算是一种痒点创新——即可有可无的存在。如果我们能够躺在床上:“hey Siri
大数据文摘
2018/05/25
1.6K0
智能家居通信协议之争,谁会是最终赢家?
清晨和煦的阳光照进屋内,你慢慢苏醒,原来是智能窗帘缓缓为你打开,智能睡眠显示你昨晚翻身起夜等数据在正常范围内,嗯,确实,昨夜你睡得很好,因为智能检测环境系统在实时净化房间里的空气,美好的一天就此开始。
SDNLAB
2020/07/02
2.5K0
智能家居通信协议之争,谁会是最终赢家?
【Airplay】WWDC学习_苹果开发者大会
偏离绿色应答线条 这意味着我们将数据发送到 网络的速度快于数据从另一侧被输出 和被应答的数据 如果数据被输入的速度 快于被输出的速度
天天Lotay
2023/04/07
7850
【Airplay】WWDC学习_苹果开发者大会
RaspberryPi接入HomeKit
是一个轻量的NodeJS服务,你可以在你家的局域网中运行这个来模拟IOS HomeKit API。它支持很多插件,提供基本的桥来将一些智能家居厂商提供的第三方API接入HomeKit 自从siri支持HomeKit设备,这意味着你可以通过Homebridge,用siri来控制那些不支持HomeKit的设备。
治电小白菜
2020/08/25
2K0
RaspberryPi接入HomeKit
【HomeKit】HAT User Manual教程
本文档介绍了Apple HomeKit配件测试仪(HAT)的配置和使用方法。HAT是一个Mac应用程序,它充当多个HomeKit附件协议(HAP)客户端,用于开发、调试和测试附件功能。
天天Lotay
2023/10/15
4030
【HomeKit】HAT User Manual教程
[译]《iOS Human Interface Guidelines》——Sound声音
无论声音是你app用户体验的主要部分还是一个可选的增益,你都要知道用户对声音有何期待以及如何满足这些期待。
Cloudox
2021/11/23
1.8K0
[译]《iOS Human Interface Guidelines》——Sound声音
智能家居浪潮来袭,如何让机器看懂世界 | Q推荐
从智能单品到全屋智能,随着消费者对生活品质追求的提升,智能化产品逐渐走入大众家庭,从而推动智能家居市场蓬勃发展。从 2017 年开始,智能家居设备已经应用于日常生活各项任务。2017 年其市场规模约为 4.3 亿美元。据 IDC 预测,智能家居市场年复合增长率为 18.5%,2022 年智能家居设备销售额将达到 9.4 亿美元。面对潜力无限的智能家居市场,各企业纷纷发力,然而由于智能家居产品多涉及音视频技术,自行开发往往门槛过高。如何轻松构建具有实时计算机视觉功能的应用程序?亚马逊云科技 Tech Talk
深度学习与Python
2023/03/29
1.2K0
智能家居浪潮来袭,如何让机器看懂世界 | Q推荐
先睹为快!CES 2017最佳创新奖30款产品为您揭晓
作为世界上最大、影响最为广泛的消费类电子技术年展,CES已经成功举行了49届。而那些在CES上获奖的产品大部分都代表着未来科技的发展,可以说,CES已经成为全球各大电子产品企业发布产品信息和展示高科技水平及倡导未来生活方式的窗口。 根据CES的传统,每年都会面向28个产品种类设立创新奖,用以奖励那些产品设计和工业设计优秀的产品。想知道,今年又是哪些优秀的产品入选了最佳创作奖?快跟着小编一起看看,顺便提前探探今年CES的风向。 3D打印:Robo R2智能3D打印机 Robo智能3D打印机可与Wi-Fi相连,
VRPinea
2018/05/15
8620
Elmedia Player:Mac视频播放器下载工具
Elmedia Player是一款简单好用的Mac视频播放器,拥有大量便利功能,如内置网络浏览器,可让您上网找到合适的视频下载,以及打开网址浏览器,无需烦人的广告即可观看YouTube视频,提供无抖动和撕裂视频、流畅的播放以及完美的高清体验 。
啾咪啾咪
2022/09/20
9930
[ISUX译]iOS 9人机界面指南(三):iOS 技术 (上)
文章索引 3.1 3D触摸(3D Touch) 3.1.1 轻压和重压(Peek and Pop) 3.1.2 主屏幕快捷操作(Home Screen Quick Actions) 3.2 Live Photos 3.3 钱包(Wallet) 3.4 苹果的移动支付平台(Apple Pay) 3.5 研究型应用程序(Research Apps) 3.6 应用扩展(App Extensions) 3.6.1 今天部件(Today Widgets) 3.6.2 分享和动作扩展(Share and Action
腾讯ISUX
2018/06/29
1.7K0
1.14 VR扫描:索尼公布2018年PS VR下载TOP 10;苹果将发布后置三摄iPhone
今日,索尼发布了2018年PS VR平台的年度下载排行榜。TOP 10分别为《Job Simulator》、《Beat Saber》、《Superhot VR》、《PlayStation VR Worlds》、《Rick and Morty:Virtual Rick-ality》、《亚利桑那的阳光》、《Moss》、《Until Dawn: Rush of Blood》、《Driveclub VR》及《Surgeon Simulator: Experience Reality》。榜单上除了《Beat Saber》之外并没有第二款2018年发布的新游戏。
VRPinea
2019/04/29
7770
1.14 VR扫描:索尼公布2018年PS VR下载TOP 10;苹果将发布后置三摄iPhone
Elmedia Video Player Pro Mac中文激活版(Mac视频播放软件)
Elmedia Video Player Pro Mac版是一款好用的mac视频播放软件。Elmedia Video Player Pro下载支持多种视频格式,无论是AVI,MP4,WMV,MKV,MP3,M4V。你不需要安装额外的编解码器和插件即可播放。支持Chromecast,AirPlay和DLNA 等无线技术。
Mac小小
2022/08/26
9660
推荐阅读
相关推荐
【HomeKit】从HomeKit架构层细化到HomeKit ADK集成
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验