为什么我不能将dlib中的matrix_exp分配给std :: vector?

时间:2017-03-10 14:31:20

标签: c++ dlib

由于其出色的矩阵子模块,我正在使用Dlib。我发现做快速科学算法非常完整和有用。我设法添加了一些自定义操作,并获得了它的工作原理。

但是,有一段时间以来,有一个问题困扰着我。有没有具体原因为什么似乎不可能将任何类型的矩阵表达式分配给std::vector

编辑:

这是典型的dlib函数:

template <typename EXP>
const matrix_op<op_trans<EXP> > trans(const matrix_exp<EXP>& m) {
  typedef op_trans<EXP> op;
  return matrix_op<op>(op(m.ref());
}

如果我想实现相应的函数并返回std::vector,我想我会这样做:

template <typename EXP>
const std::vector<matrix_op<op_trans<EXP> > > trans(const std::vector<matrix_exp<EXP> >& ms) {
  std::vector<matrix_op<op_trans<EXP> > > out(ms.size());
  typedef op_resize_bilinear<EXP> op;
  for (int i = 0; i < ms.size(); ++i)
    out[i] = matrix_op<op>(op(ms.ref()));
  return out;
}

但是当它起作用时,任何表达式都被matrix_exp视为matrixmatrix_opmatrix_add_exp ......但std::vector<matrix_exp>并非如此:

‘const std::vector<smu::matrix<float> >’ is not derived from ‘const std::vector<smu::matrix_exp<EXP> >’

我只是想知道这是否是dlib的故意,如果有任何理由,因为它可能在几个需要同时处理多个矩阵的算法中有用...并且如果一些解决方法可以工作< / p>

1 个答案:

答案 0 :(得分:1)

(免责声明:我第一次看dlib,我在黑暗中拍摄,并且不知道dlib /它的矩阵类实际上是如何工作的。)

dlib::matrix has member functions including begin() and end(),将......

  

...如果layout是row_major_layout,则按行主要顺序迭代矩阵的元素,如果layout是column_major_layout,则按列主顺序迭代。

分配到std::vector因此可以非常简单地完成:

 dlib::matrix< ... > mat;
 // fill the matrix, do operations on it etc.    
 std::vector< mat::type > vec( mat.begin(), mat.end() );

这是否是你要找的,我不知道,因为你没有真正告诉我们。 ; - )