类Matrix编写全记录(1)
2006-03-31 23:19
190 查看
第一部分:Matrix的编写缘由
1、深入研究矩阵的相关属性,以及与属性相关的语言实现方法
2、作为阅读<<C++ Template>>过程中练习。
3、作为提供给我将来使用的库的一部分。
第二部分:Matrix的概貌
1、由于matrix类主要是面向想我这样的程序设计者,所以采用模板来实现。
2、由于Matrix类打算被用作数学库的一部分,所以我尽可能编写得标准,功能完善。
3、Matrix类提供迭代器,以配合STL算法的使用。
4、Matrix类除了实现矩阵的简单存取功能以外,还实现相关的矩阵变换操作、行列式的计算(如果是 方 阵的话)。
5、Matrix类不能在线程之间共享。
6、Matrix类实现+ - × 矩阵转置、矩阵分块、矩阵求秩等功能。
第三部分:编写中的问题(FAQ)
1、把十分简单却绝对不能错的常用表达式表示成用#define语句声明的宏。如,数组下标的offset可以用一个宏来封装,这样在编写过程中能够保证不会出现如此低级却致命的错误。一旦出现这种错误,有可能消耗你三四倍编写一个strcat函数的时间。
2、在模板的编写中会出现很多模板的参数表、class-id。class-id有一些是经常使用的,并且很多时候都具有一定的意义。这时候,可以使用typedef关键字在类声明前部首先定义。在定义的时候用一个简短并且有意义的组合标识符,一方面可以减少以后字符的输入量,另一方面可以减少由于编写过程中粗心大意造成的错误(漏符号)和提高程序可读性。虽然有很多人觉得这样好像没有太大必要,但是我们却没有看到过一个好的类库不使用这种方法以使程序变得简洁,可读性强。
例子:
typedef Matrix<M,N,T> ThisType;
typedef const ThisType Const_ThisType;
typedef Matrix<N,M,T> TranMatrix;
typedef const TranMatrix Const_TranMatrix;
另外,我们可以看到早在C语言时代,这个关键字就非常流行。可以说几乎每一份有质量的代码都会有它的踪迹。我们知道曾经有很多人抱怨过C语言可移植性不够强。这些呼声或多或少让typedef这个关键字更受欢迎了。实际上,当我们用typedef 这个关键字为某一种数据类型定义别名,并且使用该别名的时候就屏蔽了与特定机器有关的数据在底层的处理的差别。这样,如果我们想把我们的代码从32位机移植到64位机上,就只需要简单地修改一下用typedef声明的数据类型就行了,而不用在每一个使用该类型的地方进行修改。也就是说,typedef关键字从一定程度上提高了程序的可移植性。
我在第一次编写的时候就没有留意这个问题,所以当我后面修改的时候浪费了很多时间!
3、编写的时候要时刻记住现在编写的是什么类型的类。这很重要!因为类型不同会让你使用不同不同的方式对待同一个操作。有时候合理使用inline是一个好方法。
4、关键字const是一个能够使类结构严谨清晰的东西。如果一个成员函数不会修改本类的成员的话,const是一个明智的选择。
5、在模板类里面也许你很容易就能写出一个函数能够接受多种类型的参数(member template).。但是,我发现过度使用这用灵活性会使得这个类失去较严格的数据类型检查。由此导致的后果也许会使得代码意外地低效,因为有可能每一步赋值运算都会让系统调用类型转换函数(低效)。这也许只是低效的原因之一。所以,我觉得这种特性不应该用在矩阵的运算函数里面,但是如果在构造函数中使用却能扩大这个类的构造能力。该特性也可以用在设置数据成员的函数里面使用。
6、如果使用了member template定义一个成员函数,就没必要再编写一个和本类相容的成员函数。
除非,这两种问题的实作有所不同。
1、深入研究矩阵的相关属性,以及与属性相关的语言实现方法
2、作为阅读<<C++ Template>>过程中练习。
3、作为提供给我将来使用的库的一部分。
第二部分:Matrix的概貌
1、由于matrix类主要是面向想我这样的程序设计者,所以采用模板来实现。
2、由于Matrix类打算被用作数学库的一部分,所以我尽可能编写得标准,功能完善。
3、Matrix类提供迭代器,以配合STL算法的使用。
4、Matrix类除了实现矩阵的简单存取功能以外,还实现相关的矩阵变换操作、行列式的计算(如果是 方 阵的话)。
5、Matrix类不能在线程之间共享。
6、Matrix类实现+ - × 矩阵转置、矩阵分块、矩阵求秩等功能。
第三部分:编写中的问题(FAQ)
1、把十分简单却绝对不能错的常用表达式表示成用#define语句声明的宏。如,数组下标的offset可以用一个宏来封装,这样在编写过程中能够保证不会出现如此低级却致命的错误。一旦出现这种错误,有可能消耗你三四倍编写一个strcat函数的时间。
2、在模板的编写中会出现很多模板的参数表、class-id。class-id有一些是经常使用的,并且很多时候都具有一定的意义。这时候,可以使用typedef关键字在类声明前部首先定义。在定义的时候用一个简短并且有意义的组合标识符,一方面可以减少以后字符的输入量,另一方面可以减少由于编写过程中粗心大意造成的错误(漏符号)和提高程序可读性。虽然有很多人觉得这样好像没有太大必要,但是我们却没有看到过一个好的类库不使用这种方法以使程序变得简洁,可读性强。
例子:
typedef Matrix<M,N,T> ThisType;
typedef const ThisType Const_ThisType;
typedef Matrix<N,M,T> TranMatrix;
typedef const TranMatrix Const_TranMatrix;
另外,我们可以看到早在C语言时代,这个关键字就非常流行。可以说几乎每一份有质量的代码都会有它的踪迹。我们知道曾经有很多人抱怨过C语言可移植性不够强。这些呼声或多或少让typedef这个关键字更受欢迎了。实际上,当我们用typedef 这个关键字为某一种数据类型定义别名,并且使用该别名的时候就屏蔽了与特定机器有关的数据在底层的处理的差别。这样,如果我们想把我们的代码从32位机移植到64位机上,就只需要简单地修改一下用typedef声明的数据类型就行了,而不用在每一个使用该类型的地方进行修改。也就是说,typedef关键字从一定程度上提高了程序的可移植性。
我在第一次编写的时候就没有留意这个问题,所以当我后面修改的时候浪费了很多时间!
3、编写的时候要时刻记住现在编写的是什么类型的类。这很重要!因为类型不同会让你使用不同不同的方式对待同一个操作。有时候合理使用inline是一个好方法。
4、关键字const是一个能够使类结构严谨清晰的东西。如果一个成员函数不会修改本类的成员的话,const是一个明智的选择。
5、在模板类里面也许你很容易就能写出一个函数能够接受多种类型的参数(member template).。但是,我发现过度使用这用灵活性会使得这个类失去较严格的数据类型检查。由此导致的后果也许会使得代码意外地低效,因为有可能每一步赋值运算都会让系统调用类型转换函数(低效)。这也许只是低效的原因之一。所以,我觉得这种特性不应该用在矩阵的运算函数里面,但是如果在构造函数中使用却能扩大这个类的构造能力。该特性也可以用在设置数据成员的函数里面使用。
6、如果使用了member template定义一个成员函数,就没必要再编写一个和本类相容的成员函数。
除非,这两种问题的实作有所不同。
相关文章推荐
- mybatis中mysql编写记录
- 图像检索服务器编写问题记录——特征库的存储问题
- 关于PE病毒编写的学习(五)——病毒如何做标记和记录信息
- 零基础写python爬虫之爬虫编写全记录
- git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
- HDU 5671 Matrix(思维题目,记录变化)
- Makefile编写过程记录
- delphi(中心软件编写,记录)
- 图像检索服务器编写问题记录——服务端的任务队列线程分配的反思
- 关于一些Opengl ES Shader编写的记录
- 记录apache-cxf-3.0.4编写web服务的过程(2)——集合
- 图像检索服务器编写问题记录——日志系统问题记录
- SQL编写常见错误记录
- 【代码全】使用SpringAOP编写日志记录(插入oracle数据库中)
- Android学习记录(9)—Android之Matrix的用法
- 2004.7.15 [C#学习记录]使用C#编写一个自定义控件(高
- 定时关机程序编写记录
- 随机生成一些数字并传入某个方法。编写一个程序,每当收到新字符数字时,找出并记录中位数。
- 大二编写了8皇后问题,大三重新写N皇后问题 ,(特此记录一下学习历程)
- Java基础学习记录笔记(运行环境+程序编写)