我正在编写一个C++函数,该函数操作作为参数传递的矩阵,并希望代码能够处理不同类型的矩阵(例如Boost稀疏矩阵、std::vectors of std::vectors)。我目前的方法是为基本矩阵操作定义重载方法,以提供对不同类型矩阵的统一接口,并将我的函数定义为使用这些重载方法的模板函数。
#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <iostream>
typedef std::vector<double> vec;
typedef std::vector<vec> mat;
typedef boost::numeric::ublas::compressed_matrix<double, boost::numeric::ublas::row_major> spmat;
namespace matrix
{
inline void set(spmat & input, u_int i, u_int j, double val)
{
input(i, j) = val;
}
inline void set(mat & input, u_int i, u_int j, double val)
{
input[i][j] = val;
}
inline u_int size1(const mat & input)
{
return input.size();
}
inline u_int size2(const mat & input)
{
return input[0].size();
}
inline u_int size1(const spmat & input)
{
return input.size1();
}
inline u_int size2(const spmat & input)
{
return input.size2();
}
inline double get(const spmat & input, u_int i, u_int j)
{
return input(i, j);
}
inline double get(const mat & input, u_int i, u_int j)
{
return input[i][j];
}
}
对于简单的任务,这种方法似乎是可行的。然而,目前我正在尝试编写一个需要迭代遍历所有条目的函数,在密集矩阵中为所有条目,在稀疏矩阵中仅为非零条目。我知道如何分别为每种情况执行此操作,但希望只有一个实现可以在两种情况下工作。有什么标准方法可以实现这一点吗?
dense_iterator
和一个sparse_iterator
,并将操作编写为模板函数。 - Caleth