将`dlib::matrix<T>`转换为`dlib::matrix<S>`的好方法?

Good way to cast `dlib::matrix<T>` into `dlib::matrix<S>`?

dlib::matrix<T>转换成dlib::matrix<S>有什么好方法? 例如,dlib::matrix<float> 变成 dlib::matrix<std::complex<float> >?

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

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());
}

什么演员至少需要

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

通常情况并非如此,因为虚部不放在虚部内存中。

您可以检查是否

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

更快。

您想打电话给 complex_matrix(your_real_matrix)。参见 http://dlib.net/dlib/matrix/matrix_math_functions_abstract.h.html#complex_matrix。还有各种类似的铸造套路。