铸造双*复杂*

时间:2014-02-21 13:57:55

标签: c++ type-conversion

我正在尝试将double *转换为复杂*。 我只是有一个2x2矩阵D(双)的例子,我想把它变成复杂的(C):

typedef complex<double> dcmplx;

 int main() {

   dcmplx *C;
   double *D;
   int N=2;

   D=new double[N*N];
   C=new dcmplx[N*N];
   *C=static_cast<dcmplx>(*D);

   for (int i=0;i<N;i++){
     for (int j=0;j<N;j++){
      D[i*N+j]=i+j;
     }
   }


    for (int i=0;i<N;i++){
     for (int j=0;j<N;j++){
      cout <<D[i*N+j]<<"\t";
     }
     cout <<"\n";
   }


   cout <<"\n\n";
   cout <<"Complex\n";
   for (int i=0;i<N;i++){
     for (int j=0;j<N;j++){
      cout <<C[i*N+j]<<"\t";
     }
     cout <<"\n";
   }


  return 0; 

 }

这是正确的方法吗?

3 个答案:

答案 0 :(得分:2)

从c ++ 11开始,你可以将复数数组转换为双数组, 见http://en.cppreference.com/w/cpp/numeric/complex

所以这是可能的: std::complex<double> a[10]; double *b = reinterpret_cast<double *>(a);

它也适用于矢量:

std::vector<std::complex<double>> a(10); double *b = reinterpret_cast<double *>(a.data());

非常方便。

答案 1 :(得分:1)

*D不是数组,它是double - D指向的块的第一个元素。

同样,*C也不是数组。

您正在做的是将D[0]分配给C[0]。您不需要为此进行强制转换,因为complex具有合适的赋值运算符。

您无法将double*强制转换为std::complex<double>*,因为指向的类型不相关。

如果您想从complex<double>数组中构建double数组,我认为最简单的方法是使用std::copy
如果你不能这样做,请使用循环并按元素分配元素。

您还应该考虑使用std::vector而不是手动内存管理。

答案 2 :(得分:1)

首先std::complex<double>double是不兼容的类型,因此无法通过static_cast进行投射。

您可以使用std::complex的可用标准运算符进行转换, 看看http://www.cplusplus.com/reference/complex/complex/operators/

下面的转换查找的虚拟示例,这只是一个示例,找到std::copy的优雅解决方案,或者可能与其他STL算法一起使用!我永远不会在我的最终源代码中使用这样的代码:)

for (size_t i = 0; i < N * N; i++)
{
   *C = *D;   
   D++;
   C++;
}

最后,如果这两种类型在某种程度上兼容,你必须像这样正确地投射指针。

C = static_cast<dcmplx*>(D);


更新:为您准备一个好榜样,享受:)

   std::vector< std::complex<double> > C (N*N);
   double* D = new double[N*N];
   // initialization of D's elements
   C.assign(D, D + N*N);