Я пишу функцию 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];
}
}
Для простых задач этот подход, похоже, работает.В настоящее время, однако, я пытаюсь написать функцию, которая должна перебирать все записи, в случае плотной матрицы, или только ненулевые записи, в случае разреженной матрицы.Я знаю, как сделать это для каждого случая индивидуально, но хотел бы иметь только одну реализацию, которая работает в обоих случаях.Каков был бы стандартный способ достижения этого?