您好、欢迎来到现金彩票网!
当前位置:2019跑狗图高清彩图 > 向量化率 >

MATLAB 效率分析

发布时间:2019-08-09 22:19 来源:未知 编辑:admin

  关于MATLAB的效率问题,很多文章,包括我之前写的一些,主要集中在使用向量化以及相关的问题上。但是,最近我在实验时对代码进行profile的过程中,发现在新版本的MATLAB下,for-loop已经得到了极大优化,而效率的瓶颈更多是在函数调用和索引访问的过程中。

  由于MATLAB特有的解释过程,不同方式的函数调用和元素索引,其效率差别巨大。不恰当的使用方式可能在本来不起眼的地方带来严重的开销,甚至可能使你的代码的运行时间增加上千倍(这就不是多买几台服务器或者增加计算节点能解决的了,呵呵)。

  下面通过一些简单例子说明问题。(实验选在装有Windows Vista的一台普通的台式机(Core2 Duo 2.33GHz + 4GB Ram)进行,相比于计算集群, 这可能和大部分朋友的环境更相似一些。实验过程是对某一个过程实施多次的整体进行计时,然后得到每次过程的平均时间,以减少计时误差带来的影响。多次实验,在均值附近正负20%的范围内的置信度高于95%。为了避免算上首次运行时花在预编译上的时间,在开始计时前都进行充分的“热身”运行。)

  一个非常简单的例子,把向量中每个元素加1。(当然这个例子根本不需要调函数,但是,用它主要是为了减少函数执行本身的时间,突出函数解析和调用的过程。)

  所需的平均时间大概是0.00110 sec。从统计意义上说,和vectorization已经没有显著差别。无论是for-loop或者vectorization,每秒平均进行约10亿次“索引-读取-加法-写入”的过程,计算资源应该得到了比较充分的利用。

  inline function是一种传统的通过表达式字符串构造函数的过程

  feval的好处在于可以以字符串方式指定名字来调用函数,当然它也可以接受别的参数。

  由于在MATLAB的内部实现中,function handle的解析是在赋值过程中进行的,所以预先用一个变量把句柄接下,其效果就是预先完成了句柄解析,而如果直接把@fm或者@(x) x + 1写在参数列上,虽然写法简洁一些,但是解析过程是把参数被赋值到所调函数的局部变量时才进行,每调用一次解析一次,造成了巨大的开销。

  除了函数调用,数据的访问方式对于效率也有很大影响。MATLAB主要支持下面一些形式的访问:

  这里主要探索单个元素或者域的访问(当然,MATLAB也支持对于子数组的非常灵活整体索引)。

  我们可以看到MATLAB对于单个数组元素或者静态的struct field的访问,可以达到不错的速度,在主流台式机约每秒2亿次(连同for-loop的开销)。而cell array的访问则明显缓慢,约每秒400万次(慢了50倍)。MATLAB还支持灵活的使用字符串来指定要访问域的语法(动态名字),但是,是以巨大的开销为代价的,比起静态的访问慢了200倍以上。

  MATLAB在新的版本中(尤其是2008版),对于面向对象的编程提供了强大的支持。在2008a中,它对于OO的支持已经不亚于python等的高级脚本语言。但是,我在实验中看到,虽然在语法上提供了全面的支持,但是matlab里面面向对象的效率很低,开销巨大。这里仅举几个例子。

  object中的property的访问速度是3500万次,比struct field慢了6-8倍。MATLAB提供了一种叫做dependent property的属性,非常灵活,但是,效率更低,平均每秒访问速度竟然低至2.6万次(这种速度基本甚至难以用于中小规模的应用中)。

  object中method调用的效率也明显低于普通函数的调用,对于instance method,每百万次调用,平均需时5.8秒,而对于static method,每百万次调用需时25.8秒。这相当于每次调用都需要临时解析的速度,而matlab的类方法解析的效率目前还明显偏低。

  MATLAB中可以通过改写subsref和subsasgn的方法,对于对象的索引和域的访问进行非常灵活的改造,可以通过它创建类似于数组的对象。但是,一个符合要求的subsref的行为比较复杂。在一个提供了subsref的对象中,大部分行为都需要subsref进行调度,而默认的较优的调度方式将被掩盖。在一个提供了subsref的类中(使用一种最快捷的实现),object property的平均访问速度竟然降到1万5千次每秒。

  虽然for-loop的速度有了很大改善,vectorization(向量化)仍旧是改善效率的重要途径,尤其是在能把运算改写成矩阵乘法的情况下,改善尤为显著。

  在不少情况下,for-loop本身已经不构成太大问题,尤其是当循环体本身需要较多的计算的时候。这个时候,改善概率的关键在于改善循环体本身而不是去掉for-loop。

  MATLAB的函数调用过程(非built-in function)有显著开销,因此,在效率要求较高的代码中,应该尽可能采用扁平的调用结构,也就是在保持代码清晰和可维护的情况下,尽量直接写表达式和利用built-in function,避免不必要的自定义函数调用过程。在次数很多的循环体内(包括在cellfun, arrayfun等实际上蕴含循环的函数)形成长调用链,会带来很大的开销。

  在调用函数时,首选built-in function,然后是普通的m-file函数,然后才是function handle或者anonymous function。在使用function handle或者anonymous function作为参数传递时,如果该函数被调用多次,最好先用一个变量接住,再传入该变量。这样,可以有效避免重复的解析过程。

  在可能的情况下,使用numeric array或者struct array,它们的效率大幅度高于cell array(几十倍甚至更多)。对于struct,尽可能使用普通的域(字段,field)访问方式,在非效率关键,执行次数较少,而灵活性要求较高的代码中,可以考虑使用动态名称的域访问。

  虽然object-oriented从软件工程的角度更为优胜,而且object的使用很多时候很方便,但是MATLAB目前对于OO的实现效率很低,在效率关键的代码中应该慎用objects。

  如果需要设计类,应该尽可能采用普通的property,而避免灵活但是效率很低的dependent property。如非确实必要,避免重载subsref和subsasgn函数,因为这会全面接管对于object的接口调用,往往会带来非常巨大的开销(成千上万倍的减慢),甚至使得本来几乎不是问题的代码成为性能瓶颈。

  Profile(分析)在加速你的matlab程序之前,你需要知道你的代码哪一部分运行最慢。matlab提供个简单的机制,让你能够知道你的代码的某一部分运行所占用CPU时间。通过在代码段开始添加tic,...博文来自:xiaotianlan的专栏

  在复杂网络中,为寻求众多节点中的关键节点,现在衡量其指标有节点的度、介数、平均路径、聚类系数等等~求用matlab实现这些衡量指标,求大神指导,或者推荐哪里可以更好的找到。谢谢论坛

  以前一直觉得C++效率最高,速度最快,但是今天做的一个实验结果大大出乎我的意料—Python使用向量处理效率一点都不慢,甚至高于C++在O2优化后的效率。Matlab效率更高。这为以后选取语言提供了一...博文来自:kayneo的博客

  发动机如何画出如下的外特性曲线?用Excel提供的现有图表类型是很难完成这个功能的,但是动点歪脑筋还是能够做出如下效果,下图我简单做了个师范,再花点时间可以做的更完善点。下面上数据:解释一下思路:显而...

  这几天了,看了几本MATLAB书,想加快自己编写程序的效率和速度。通过阅读,发现还是有很多方法的,下面就讲述一些有关知识和体会。    想了解自己编写程序的执行效率和速度怎么样,在MATLAB中提供了...

  原文地址:Matlab中提高m文件执行效率的小技巧作者:intothesun这篇文章是同学发给我的,不知原文出自哪里,介绍的基本上是有些用的小技巧,关于for循环的应用,据我个人的经验,有些时候下述第...

  放弃MATLAB!简述winpython为什么比MATLAB更方便费了几天功夫,终于将Python科学计算工具winpython给熟悉了个大概,基本满足自己的需要了。费话不多说,马上讲解决一下为什么p...

  用数学软件州叭编写了交又评价的应用程序, 使交叉评价的大量计算可用叭程序执行,较好地解了计算量大和计算复杂的问题本文建立的程序为交叉评价分析的理论研究和实际应用提供了方便、有效的计算工具.

  里面有三个dea模型,投入型,产出型,超效率,都是matlab代码,打开设置下变量就可以用,希望大家共同进步!

  DEA 是由 Charnes 等人于 1978 年首次提出的, 第一个 DEA 模型为 CCR 模型。 它的优点非常明显, 如指标数据无需 量纲化, 决策者无需掌握决策单元 (DMU) 的内部生产机制, 只需要投入和产出数据就可以对DMU...

  首先,推荐一篇比较,分析了四种执行函数效率对比。Ref:结果:直接调用...

  最近在网上查了一些资料,并结合自己的经验,就如何提高matlab计算效率,总结一下几个原则:1.提前给数组分配大小。2.尽量用矢量计算,减少for循环。3.尽量调用maltab自带的函数来实现一些功能...

  用过Matlab的人都知道,Matlab是一种解释性语言,存在计算速度慢的问题,为了提高程序的运行效率,matlab提供了多种实用工具及编码技巧。 1.循环矢量化Matlab是为矢量和矩阵操作而设计的...

  算法的时间复杂度分析一个算法的好坏,一般是分析其时间复杂度T(n)和空间复杂度S(n)。其中时间复杂度(Timecomplexity)是指算法执行时耗费时间的长度,空间复杂度(Spacecomplex...

  算法的“时间复杂度”和“空间复杂度”合称为算法的复杂度。时间复杂度时间复杂度的定义可以参考以下我列下的几篇博客。计算机科学家用于表示用于一个算法的效率或计算复杂度的一种表示法,叫作大O表示法(big-...

  mathematica可能是数学界最好的狙击枪但MATLAB能给你一座军火库有人说,“MATLAB除了不会生孩子,什么都会。”矩阵运算、数据可视化、GUI(用户界面)设......

  MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。MATLA...

  Matlab优点:1.高效的数值计算功能。目前其他编程语言以及其他类似的数学软件无可替代;2.完备的计算结果和编程可视化功能。这一点其他软件,无可替代;3.接近数学表达式的自然化m语言。非常易于学习和...

  微信公众号关键字全网搜索最新排名【机器学习算法】:排名第一【机器学习】:排名第一【Python】:排名第三【算法】:排名第四送书抽奖推迟到明天5本《TensorFlow实践》MATLAB 广泛用于机器...

  原文地址:Matlab代码的耗时分析、优化、加速作者:兔子肥Profile(分析)在加速你的matlab程序之前,你需要知道你的代码哪一部分运行最慢。matlab提供个简单的机制,让你能够知道你的代码...

  feval和eval运行区别之一:feval的FN绝对不能是表达式。feval的FN只接受函数名。函数eval给MATLAB提供宏的能力。其中,该函数提供了将用户创建的函数名传给其它函数能力,以便求值...

  一般而言分析算法效率的方式有两种,即:时间效率和空间效率。时间效率也称为时间复杂度;空间效率也称为空间复杂度。在计算机技术发展的几十年中,空间资源变得不是非常重要了,因此在一般的算法分析中,讨论的主要...

  程序设计=数据结构+算法 数据结构分为逻辑结构(面向问题)和物理结构(面向计算机)。1、逻辑结构:数据元素之间的相互关系。    集合结构、线性结构(一对一)、树形结构(一对多)、图形结构(多对多)2...

  syzheng500的博客【急求!】降低算法时间复杂度的方法?附图附代码!多谢!!

  没有挤公交来上班过,就不知道生活的压力有多大。 算法的时间复杂度和空间复杂度合称为算法的复杂度。1.时间复杂度(1)时间频度一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。...

  本文详细介绍了MATLAB与HFSS的联合优化方法,并介绍了基于粒子群算法的阻抗调制表面天线的副瓣优化流程

  @HFSS往往不能建立复杂的微波器件,比如天线,以及超材料,超表面的模型,也不能很好对仿真结果进行处理。当采用(Matlab/Python)-HFSS联合仿真则可以很好的解决上述问题。并且幸运的是,A...

  使用MATLAB将FEKO方向图数据转换为HFSS方向图数据的一种方法12-03阅读数 437

http://chinoamobi.com/xianglianghualv/354.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有