编写矩阵类的简单总结

哈哈哈,这个标题有点大。其实矩阵类的代码,网上有很多,大家可以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];
还有个优点,特殊的矩阵目前我知道的只能采用这种方式实现双下标。比如压缩矩阵,每个元素是半字节,就不能直接使用指针了。那个更麻烦,还要重载=才能实现双下标,思路是一样的。

最后,矩阵类还有一个很重要的技术,很多人都忽视了--返回免拷贝造技术。
既然高手们都不说,作为吃菜的我,还是不要班门弄釜了吧。 

传闻中的begtostudy之编程技术文集

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值