C++矩阵优化算法

写在前面的话:此矩阵优化算法并非原创,笔者只是转述了一种智慧。 


在C++中,定义一个矩阵通常是这样的:   
class   MyMatrix   
{   
        ........   
        public:   
        ........   
        float   data[50000];   

              
这里为了方便说明问题,使用固定大小的数组,实际使用中更多的是动态分配。   在对MyMatrix重载operator   +和-后,我们就可以进行如下计算了:   
MyMatrix   m1,m2,m3,m4;   
.....   
m4=m1+m2-m3;//表达式   
......   


C++编译器将表达式解释为:先把m1+m2计算好赋给一个临时MyMatrix类变量(tmp1),tmp1-m3后生成新的临时变量tmp2,然后才把tmp2赋值给m4。程序执行过程中,会产生临时变量tmp1,tmp2(有些C++编译器可以优化掉其中一个或全部),由于data一般较大,分配内存会占用时间和空间。这就是为什么在数值计算方面强大的C++比Fortran慢的重要原因之一。但如果放弃MyMatrix的operator   +和-重载,添加operator   []取data[]的重载后,写如下代码:   


struct   plus;   struct   minus;   
template   <class   L,   class   OpTag,   class   R>   
struct   Expression   
{   
        Expression(L   const&   l,   R   const&   r)   
                    :   l(l),   r(r)   {} 


        float   operator[](unsigned   index)   const;   


        L   const&   l;   
        R   const&   r;   
};   


template   <class   L,   class   R>   
Expression <L,plus,R>   operator+(L   const&   l,   R   const&   r)   
{   
        return   Expression <L,plus,R> (l,   r);   
}   
template   <class   L,   class   R>   
Expression <L,minus,R>   operator-(L   const&   l,   R   const&   r)   
{   
        return   Expression <L,minus,R> (l,   r);   
}   
struct   plus   
{   
        static   float   apply(float   a,   float   b)   
        {   return   a   +   b;   }   
};   


struct   minus   
{   
        static   float   apply(float   a,   float   b)   
        {   return   a   -   b;   }   
};   


对MyMatrix添加=重载:   
template   <class   Expr>   
MyMatrix   &MyMatrix::operator=(Expr   const&   x)   
{   
        for   (unsigned   i   =   0;   i   <   50000;   i++)   
                (*this)   =   x;   
        return   *this;   
}   


然后计算:   
......   
m4=m1+m2-m3;   




这时生成的临时变量类型是Expression <L,plus,R> ,和Expression <Expression <L,plus,R>   ,minus,R> ,   它们占用的内存远比MyMatrix小,Expression直到operator=MyMatrix   的时候才展开计算,实际上是把矩阵运算变成了加法,所以大大加快了速度。这正是数值计算所需要的。   
这种方法叫Expression   templates优化。更多细节参考 < <C++   template> > 、Blitz++库、boost::ublas库和MTL库等。 


后话:编程语言之争一直是热门话题。因为笔者所接触的有限元计算程序涉及大规模的数值计算,所以笔者也曾花了2年时间搞腾Fortran。最后,笔者还是放弃古老的Fortran,转投C++的阵营了——毕竟连微软都早放弃Fortran了:) 


Fortran在数值计算方面的确有些优势,但Fortran在软件工程方面的表现得实在让人汗颜。须知,面向对象并不是一个炒作出来的概念,面向对象对改进软件工程方面起了里程碑式的作用,大大提高了软件开发效率。 


从本质上看,可执行程序都编译成二进制代码了,怎么会存在Fortran比C++快的道理?其实最主要原因还是开发人员对C++的数值计算不熟悉所致。从上面的例子也可以看出,Fortran只是在某些方面做了一些适合数值计算的技术处理,C++并非不能做到,只是一般人平时没留心罢了。 


Fortran计算速度快还有一个原因是大量使用了全局变量。Fortran有一个公共变量块的定义,可以在那里设置全局变量。如果你愿意,你也可以在C++程序中大量使用全局变量提高程序运行速度。问题是这样做的后果是在软件工程方面带来无尽的后遗症,软件维护变得异常困难。 


C++比Fortran慢有一个不好克服的原因就是使用了面向对象。虚函数的重载要查找虚函数表,必然会降低效率。所以在听说了Fortran要支持面向对象以后,彻底让笔者转投到C++的阵营去了——如果Fortran支持面向对象,他在数值计算方面的优势将荡然无存。 


Fortran,过时的工具了,还是放弃吧。 


我的博客:   http://chenkong0500.blog.163.com/ 
欢迎交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win7(windows 7)系统下安装SQL2005(SQL Server 2005)图文教程

由于工作需要&#xff0c;今天要在电脑上安装SQL Server 2005。以往的项目都是使用Oracle&#xff0c;MS的数据库还真的没怎么用过&#xff0c;安装Oracle已经轻车熟路&#xff0c;但装SQL Server好像还有点小麻烦&#xff0c;所以记录下来&#xff0c;以留备用。 ------------…

tensorflow中的Supervisor

tf.train.Supervisor()可以帮我们简化一些事情&#xff0c;可以保存模型参数和Summary&#xff0c;它有以下的作用&#xff1a; 1&#xff09;自动去checkpoint加载数据或初始化数据 &#xff0c;因此我们就不需要手动初始化或者从checkpoint中加载数据 2&#xff09;自身有一个…

jaxb 解析list元素_JAXB和根元素

jaxb 解析list元素XmlRootElement是人们习惯于与JAXB&#xff08;JSR-222&#xff09;一起使用的注释。 目的是将根元素与类唯一关联。 由于JAXB类映射到复杂类型&#xff0c;因此一个类有可能对应于多个根元素。 在这种情况下&#xff0c;无法使用XmlRootElement &#xff0c;…

抓娃娃机爪不动怎么办_黄子韬吃娃娃菜能把临时牙咬断?种植牙到底结实不结实?...

黄子韬的临时牙上热搜了&#xff0c;最高排名热搜榜第四位。有关牙齿的事儿瞬间让我这个口腔医生来了八卦之心&#xff0c;在看了后面的各种评论之后&#xff0c;我大概梳理清楚这到底是怎么回事了&#xff1a;小时候因为调皮所以摔断了门牙&#xff0c;前些日子门牙做了种植牙…

从SVN迁移到Git(包括SVN历史纪录)【最系统的讲解】

从SVN迁移到git有很多方法&#xff0c;最简单的就是使用git包自带的git svn命令&#xff08;git v1.7及以上&#xff09;。除此之外还有一些第三方的专门的转换工具如http://www.subgit.com/&#xff0c;https://www.atlassian.com/git/tutorials/migrating-overview/等。但是由…

反射的应用

class Teacher:OPERATE_DIC [(创建课程, create_course),(创造学生, create_student),(创建课程, create_course),(查看学生信息, check_student_info),]def __init__(self, name):self.name namedef create_course(self):print(创建课程)def create_student(self):print(创建…

抖音数据统计_26万条抖音数据背后的推荐逻辑以及严重失调的男女比例

本文作者&#xff1a;喜哥&#xff08;张佳&#xff09;易灵微课《数据分析-认知与实践》讲师新榜数据分析师人人都是产品经理、华尔街见闻专栏作家简书科技类优秀作者本文首发自公众号喜新&#xff08;noyanjiu&#xff09;,如需转载请注明出处这次是26W条数据&#xff0c;应该…

SQL SERVER 数据库主键和外键的思考

SQL SERVER 数据库主键和外键的思考 什么是主键&#xff1a; 主键是指表中一个列或者列的组合&#xff0c;其值能够唯一的标识表中的每一个行。这样的一列或者多列成为表的主键&#xff0c;通过它可以强制表的实体完整性。当创建或者更改表时可以通过定义PRIMARY KEY约束来创建…

在Gradle 2.13中更好地处理“在插件Y上找不到属性X”

您可能从未听说过的服务缺少用户名&#xff0c;密码或令牌&#xff1f; 这通常发生在您尝试执行任何操作&#xff08;例如仅构建项目&#xff09;时&#xff0c;不仅发生在使用给定的插件&#xff08;例如在线代码覆盖工具&#xff09;时。 我不想修改我的环境&#xff0c;而只…

2018/7/31 -zznu-oj -问题 C: 磨刀- 【扩展欧几里得算法的基本应用】

问题 C: 磨刀 时间限制: 1 Sec 内存限制: 128 MB提交: 190 解决: 39[提交] [状态] [讨论版] [命题人:admin]题目描述 磨刀是一个讲究的工作&#xff0c;只能在n℃下进行&#xff0c;所以我们首先要做的就是把刀的表面温度提升到n℃。处理刀身温度有两种方式&#xff1a;1.淬火…

统计各个函数的耗时_分享一次CMS GC耗时狠高优化过程全记录

1. 背景多个业务线的应用出现LongGC告警最近一段时间&#xff0c;经常收到CAT报出来的Long GC告警(配置为大于3秒的为Longgc)。2. 知识回顾2.1 JVM堆内存划分新生代(Young Generation)新生代内被划分为三个区&#xff1a;Eden&#xff0c;from survivor&#xff0c;to survivor…

用JDBC直连方式访问SQL Server 2005详解

用JDBC直连方式访问SQL Server 2005详解 1.安装JDK&#xff0c;配置其环境变量&#xff1a;(笔者所用版本为1.6版) &#xff08;1&#xff09;从官方网http://java.sun.com/jdk下载安装文件。 &#xff08;2&#xff09;安装下载下来的安装包&#xff0c;按照提示安装成…

string类有可以调换方向的函数吗_深度剖析C++中的inline函数

点蓝色字关注“CurryCoder”微信公众号&#xff1a;CurryCoder的程序人生 怕什么真理无穷&#xff0c;进一寸有一寸的欢喜1.inline函数的爱恨两难内联函数比宏优点好很多&#xff0c;详细原因请参见尽量以const、enum、inline替换#define 。调用内联函数不需要承受函数调用所导…

javafx基础教程_JavaFX教程–基础

javafx基础教程JavaFX似乎正在RIA领域获得发展。 有了正确的工具和开发支持&#xff0c;它肯定会成为下一个最佳技术“物”的代价。 我没有在这里写任何JavaFX评论&#xff0c;因为有很多技术评论可能对它进行了广泛的评论&#xff0c;但是&#xff0c;我将编写一个简单的教程&…

prepareStatement与Statement的区别

prepareStatement与Statement的区别 1:创建时的区别&#xff1a; Statement stmcon.createStatement(); PreparedStatement pstmcon.prepareStatement(sql); 执行的时候: stm.execute(sql); pstm.execute(); 2: pstm一旦绑定了SQL,此pstm就不能执行其他的S…

什么是Spring Boot以及为什么它是用于创建微服务的首选框架

为什么要使用Spring Boot创建微服务&#xff1f; Spring Boot是Java领域众所周知的首选框架&#xff0c;用于创建Micro Services。 使用Spring引导框架&#xff0c;可以非常轻松地创建Java应用程序。 现在&#xff0c;我们将看到Spring启动框架的一些功能&#xff0c;这使其成为…

嵌入式开发有年龄限制吗_什么?!考教资有年龄限制了?2020年我还能考吗?...

近几年教师资格证越来越火爆越来越多的人都想报考&#xff0c;却又担心年龄问题&#xff0c;那么考教师资格证有年龄限制吗&#xff1f;下面小编就给大家解答一下这个问题&#xff1a;报考教师资格证是没有年龄限制的&#xff0c;只有学历限制。报考幼师教师资格证的考生必须是…

Python3的bytes/str之别

Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分。文本总是Unicode&#xff0c;由str类型表示&#xff0c;二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes&#xff0c;正是这使得两者的区分特别清晰。你不能拼接字符串和字节…

jframe透明_使JFrame透明

jframe透明首先创建一个带有滑块的框架&#xff0c;该滑块将用于设置透明度量。 import javax.swing.JFrame; import javax.swing.JSlider;public class TransparentFrame extends JFrame {public TransparentFrame() {setTitle(Transparent Frame);setSize(400,400);setDefaul…