哈哈哈,这个标题有点大。其实矩阵类的代码,网上有很多,大家可以copy。
但是,我在这里做一个简单总结。
矩阵与数组相同之处是大小固定,要不然你用STL多好,可以伸缩。
但是又不同与数组,二维数组做参数无法获知维数,这就不好了。
所以很多人都写矩阵类,其实一个好的矩阵类真的能够很好的提高开发算法的效率(我是学数值算法的,呵呵)。
废话少说,入正题。
矩阵类的关键之处在双下标的实现上,因为其它实现,比如+-×/运算的实现大家已经达成一致,基本都差不多。网上代码很多,大家比对一下就会发现。
但是双下标的实现上存在分歧。
一中方式是经典的返回行头指针,加上指针自身的[]预算符实现双下标预算。
double * Matrix::operator [](long heightPos)
{
assert(heightPos>=0 && heightPos<=height);//报错
return p+width*heightPos;
}
用的是非模版类,摘自http://blog.youkuaiyun.com/twttalk/archive/2004/10/24/149479.aspx
还有个笨办法,就是用一个数组存储行头指针,
就是一个菜鸟的方式(估计现在人家比我强了,哈哈哈)http://blog.youkuaiyun.com/WAKU/archive/2005/10/07/496188.aspx
不过这个菜鸟用了一个很好的方式:模版类
这种方式的优点是高效,直接使用指针。缺点是没有越界检查功能。
还有个有点是直接可以获得行头double* p = Matrix[3];第三行的头
还有一种方式,就是多次重载预算符[]
这个代码比较多,我就不贴在这了,自己去看吧。
http://blog.youkuaiyun.com/begtostudy/archive/2006/12/18/1448216.aspx
这种方式的优点是可以越界检查,两个下标都行。缺点是频繁的构造与析构。
还有个缺点不能直接获得行头,目前还不能,double* p = Matrix[3];
但是可以 double* p = &Matrix[3][0];
还有个优点,特殊的矩阵目前我知道的只能采用这种方式实现双下标。比如压缩矩阵,每个元素是半字节,就不能直接使用指针了。那个更麻烦,还要重载=才能实现双下标,思路是一样的。
最后,矩阵类还有一个很重要的技术,很多人都忽视了--返回免拷贝造技术。
既然高手们都不说,作为吃菜的我,还是不要班门弄釜了吧。

367

被折叠的 条评论
为什么被折叠?



