【发布时间】:2017-07-31 22:36:30
【问题描述】:
我正在使用 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 故意的,是否有任何理由,因为它可能在需要同时处理多个矩阵的几种算法中很有用......以及是否可以解决这个问题
【问题讨论】:
-
"似乎不可能将任何类型的矩阵表达式分配给 std::vector":请提供详细信息。请参阅“如何创建最小、完整且可验证的示例”:stackoverflow.com/help/mcve
-
你得问问库维护者为什么要实现这个功能?
-
是的,这更多的是他们没有在库本身中获得此功能的原因。我自己没有看到任何大问题,但我是模板表达技术的新手,所以如果有很大的原因,我只是想知道,我没有在互联网上找到类似的问题......
-
@baptiste -- DevSolar 给出的答案表明作者是明智的。如果您想将矩阵存储在其他一些序列容器中,例如
std::deque或std::list等,该怎么办?使用迭代器范例,可以将 dlib::matrix 存储在这些其他容器中,而不仅仅是std::vector。