由于其出色的矩阵子模块,我正在使用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
视为matrix
,matrix_op
,matrix_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>
答案 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() );
这是否是你要找的,我不知道,因为你没有真正告诉我们。 ; - )