稀疏矩阵是科学计算领域一种重要的基础数据结构,在电力系统分析、电路分析等领域有着广泛的应用。本文将和大家分享本人在开发电力系统应用软件过程中使用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
读书时(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