【问题标题】:Good way to cast `dlib::matrix<T>` into `dlib::matrix<S>`?将 `dlib::matrix<T>` 转换为 `dlib::matrix<S>` 的好方法?
【发布时间】:2021-02-26 09:04:53
【问题描述】:

dlib::matrix&lt;T&gt; 转换为dlib::matrix&lt;S&gt; 的好方法是什么? 比如dlib::matrix&lt;float&gt;变成dlib::matrix&lt;std::complex&lt;float&gt; &gt;?

编辑: 我正在寻找比这更有效的东西:

template <class T> void toComplex(const dlib::matrix<T>& matr, dlib::matrix<std::complex<T> >& res) {
  res = dlib::zeros_matrix<std::complex<T> >(matr.nr(), matr.nc());
  for (unsigned i = 0; i < matr.nr(); ++i) {
    for (unsigned j = 0; j < matr.nc(); ++j) {
      res(i,j) = std::complex<T>(matr(i,j), 0);
    }
  }
}

编辑2: 更干净,但不是更快的解决方案(感谢@idclev_463035818 的建议):

template <class T> void toComplex(const dlib::matrix<T>& matr, dlib::matrix<std::complex<T> >& res) {
  res.set_size(matr.nr(), matr.nc());
  std::copy(matr.begin(), matr.end(), res.begin());
}

【问题讨论】:

  • a float 不是complex,你需要转换元素,即复制它们
  • 如果它们具有相同的尺寸也很好,除非你想做一些非常奇怪的事情。
  • @idclev463035818,当然,它需要复制。但是一个一个地复制元素是相当慢的。
  • @Surt,是的,我认为尺寸是一样的。
  • 我问你一个问题,浮点数有多少位,复数有多少?

标签: c++ dlib


【解决方案1】:

演员至少需要什么

sizeof(float) == sizeof(std::complex<float>)

通常情况并非如此,因为想象的部分没有放在想象的内存中。

你可以检查一下

<some code to resize res to matr without initializing anything>
std::copy(matr.cbegin(), matr.cend(), res.begin());

更快。

【讨论】:

  • 我想 OP 只是在滥用“演员”这个词。问题已更新并进行了一些澄清
  • 是的,我使用了“cast”这个词,因为在数学意义上,float 很复杂。
  • 也许值得注意的是,有理由期望 std::copy 比逐个元素地复制更快,这可能并不明显
【解决方案2】:

您想致电complex_matrix(your_real_matrix)。见http://dlib.net/dlib/matrix/matrix_math_functions_abstract.h.html#complex_matrix。有多种类似的铸造例程。

【讨论】:

    猜你喜欢
    • 2017-02-14
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多