稀疏矩阵实践

    稀疏矩阵是科学计算领域一种重要的基础数据结构,在电力系统分析、电路分析等领域有着广泛的应用。本文将和大家分享本人在开发电力系统应用软件过程中使用C++Template进行稀疏矩阵设计的一些体会和相关的资源,同时也请大家指正和指点。
    读书时(6年前了)尝试着用C++template写了一个对称矩阵,实现了基本的LU分解,由于不是稀疏的,只能表达一下算法,适应不了真正的工程需求。
    工作后一方面查找可用的资源,同时自己对实际需求进行总结,尝试自己的一些思路。归纳起来有这么几个要求:是面向对象的,使用C++模板(泛型)的,提供稀疏矩阵的BLAS1-3级的表示,提供部分LAPACK的函数用于稀疏矩阵的直接求解-至少包括对称LU和QR分解,效率达到工业级的,最后,free and open source的!
   04年开发新产品时,构思出了使用stl的vector和map能够表达出一个基本的系数矩阵结构:vector<map<size_t, T> >就是一个元素类型为T的稀疏矩阵。当时还考虑了两种访问方式,一种是返回数值的const成员函数,另一种是返回引用的成员函数,前者对于零元素直接返回零值,后者能够插入和修改非零元。这样一个稀疏矩阵雏形大概就是下面的样子:

//......
template<class T>
class SpMat : public vector<map<size_t, T> >
{
public:
//......
    T operator()(const size_t i, const size_t j)const
    {
       map<size_t, T>::const_iterator p_ele = operator[](i).find(j);
       return p_ele == operator[](i).end()  ? T(0) : p_ele->second;
    }
    T& Ref(const size_t i, const size_t j)
    {
       return operator[](i).operator[](j);
    }
//......
};

    后来精力有限一直没有细化下去。而寻找现有共享资源的努力一直没有停止过。首先是发现了MTL,并且用在了一个实际的参数辨识的程序中,MTL对稀疏矩阵的表示提供了很好的支持,但是没有提供系数矩阵求解的函数,只能自己动手打造了。

待续。

MTL/meschach
整型的应用。
实用的实现
glas
ublas@boost


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值