C++ 铸造'dlib::matrix<;的好方法;T>;`进入'dlib::matrix<;S>;`?

C++ 铸造'dlib::matrix<;的好方法;T>;`进入'dlib::matrix<;S>;`?,c++,dlib,C++,Dlib,将dlib::matrix转换为dlib::matrix的好方法是什么? 例如,dlib::matrix转换为dlib::matrix 编辑: 我正在寻找比这更有效的方法: template <class T> void toComplex(const dlib::matrix<T>& matr, dlib::matrix<std::complex<T> >& res) { res = dlib::zeros_matrix<

dlib::matrix
转换为
dlib::matrix
的好方法是什么? 例如,
dlib::matrix
转换为
dlib::matrix

编辑: 我正在寻找比这更有效的方法:

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);
    }
  }
}
template void to complex(常数dlib::matrix&matr,dlib::matrix&res){
res=dlib::零矩阵(matr.nr(),matr.nc());
for(无符号i=0;i
编辑2: 更干净,但不是更快的解决方案(感谢@idclev_463035818的建议):

template void to complex(常数dlib::matrix&matr,dlib::matrix&res){
res.set_尺寸(材料编号(),材料编号());
复制(matr.begin(),matr.end(),res.begin());
}

演员阵容至少需要这样做

sizeof(float) == sizeof(std::complex<float>)
sizeof(float)==sizeof(std::complex)
通常情况并非如此,因为虚部不存在于虚部存储器中

你可以检查一下

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

复制(matr.cbegin(),matr.cend(),res.begin());

更快。

您想调用
复杂矩阵(您的实矩阵)
。看见有许多类似的铸造程序。

a
float
不是一个复杂的
程序,您需要转换元素,即复制它们。如果元素的尺寸相同,也会很好,除非您想做一些非常奇怪的事情。@IDCLEV46305818,当然,它需要复制。但是一个一个地复制元素相当慢。@Surt,是的,我假设维度是相同的。让我问你一个问题,一个浮点中有多少位,一个复数中有多少位?我想OP只是误用了“cast”这个词。这个问题已经更新了一点。请注意,我使用了“cast”这个词,因为在数学意义上,float是复杂的。也许值得注意的是,有理由期望
std::copy
比逐个元素复制要快,这可能并不明显
<some code to resize res to matr without initializing anything>
std::copy(matr.cbegin(), matr.cend(), res.begin());