【问题标题】:Why can't I assign matrix_exp from dlib to std::vector? [duplicate]为什么我不能将 matrix_exp 从 dlib 分配给 std::vector? [复制]
【发布时间】: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_expmatrixmatrix_opmatrix_add_exp...但std::vector&lt;matrix_exp&gt; 并非如此:

‘const std::vector&lt;smu::matrix&lt;float&gt; &gt;’ is not derived from ‘const std::vector&lt;smu::matrix_exp&lt;EXP&gt; &gt;’

我只是想知道这是否是 dlib 故意的,是否有任何理由,因为它可能在需要同时处理多个矩阵的几种算法中很有用......以及是否可以解决这个问题

【问题讨论】:

  • "似乎不可能将任何类型的矩阵表达式分配给 std::vector":请提供详细信息。请参阅“如何创建最小、完整且可验证的示例”stackoverflow.com/help/mcve
  • 你得问问库维护者为什么要实现这个功能?
  • 是的,这更多的是他们没有在库本身中获得此功能的原因。我自己没有看到任何大问题,但我是模板表达技术的新手,所以如果有很大的原因,我只是想知道,我没有在互联网上找到类似的问题......
  • @baptiste -- DevSolar 给出的答案表明作者是明智的。如果您想将矩阵存储在其他一些序列容器中,例如std::dequestd::list 等,该怎么办?使用迭代器范例,可以将 dlib::matrix 存储在这些其他容器中,而不仅仅是 std::vector

标签: c++ dlib


【解决方案1】:

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

dlib::matrixhas member functions including begin() and end(),它将...

...如果布局是 row_major_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() );

这是否是您正在寻找的,我不知道,因为您并没有真正告诉我们。 ;-)

【讨论】:

  • 我刚刚看到你问的是matrix_exp,而不是matrix。作为大多数表现良好的 C++ 数据容器,值得注意的还有 begin()end(),它们将 "...按行主要顺序遍历矩阵的元素。"
猜你喜欢
  • 2020-10-11
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 2018-11-08
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
相关资源
最近更新 更多