C ++中加速矩阵的模板化函数

时间:2017-03-28 07:58:45

标签: c++ templates matrix boost

我需要一个函数以我希望看到的格式打印出矢量元素。截至目前,我有vector<double>vector<std::complex>的单独功能,如下所示:

void printvd(boost::ublas::vector<double> V) {
    for( int i=0;i<V.size();i++ )
      std::cout << V(i) << " ";
}
void printvc(boost::ublas::vector<std::complex> V) {
    for( int i=0;i<V.size();i++ )
      std::cout << V(i) << " ";
}

我尝试过用,

template<typename T>
void printv(boost::ublas::vector<T > V) {
    for( int i=0;i<V.size();i++ )
      std::cout << V(i) << " ";
}

但是任何调用(如printv<double>(V);)总是以未定义的引用错误结束。

我也面临着与矩阵类似的问题 - 任何帮助都会受到赞赏。如果有人可以讨论如何在boost中使用矩阵表达式,也会很好。

1 个答案:

答案 0 :(得分:0)

请确保您可以编译这个非常基本的示例,其中应解决所有路径和包含。

#include <iostream>
#include <boost/numeric/ublas/vector.hpp>
#include <complex>

using std::cout;
using std::endl;

void printvd(boost::numeric::ublas::vector<double> V) {
    for( int i=0;i<V.size();i++ )
      std::cout << V(i) << " ";
}
void printvc(boost::numeric::ublas::vector<std::complex<double>> V) {
    for( int i=0;i<V.size();i++ )
      std::cout << V(i) << " ";
}

template<typename T>
void printv(boost::numeric::ublas::vector<T > V) {
  for( int i=0;i<V.size();i++ )
      std::cout << V(i) << " ";
}

int main(int argc, char *argv[])
{
  boost::numeric::ublas::vector<double> testVector1;
  boost::numeric::ublas::vector<std::complex<double>> testVector2;

  printv(testVector1);
  printv(testVector2);
  return 0;
}

相应的CMakeLists.txt:

project(boost_vector_test)
cmake_minimum_required(VERSION 2.8)
add_executable(${PROJECT_NAME} main.cpp)

否则,boost有很好的文档,其中包含如何使用矩阵表达式的示例:http://www.boost.org/doc/libs/1_63_0/libs/numeric/ublas/doc/matrix_expression.html