【问题标题】:casting double * to complex*将 double * 转换为 complex*
【发布时间】:2014-03-23 02:06:24
【问题描述】:

我正在尝试将 double * 转换为 complex* 。 我只有一个 2x2 矩阵 D (double) 的示例,我想将其转换为复数 (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; 

 }

这是正确的做法吗?

【问题讨论】:

标签: c++ type-conversion


【解决方案1】:

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

非常方便。

【讨论】:

    【解决方案2】:

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

    同样,*C 也不是数组。

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

    您不能将double* 转换为std::complex&lt;double&gt;*,因为指向的类型是不相关的。

    如果你想从double的数组构建complex&lt;double&gt;的数组,我认为最简单的方法是使用std::copy
    如果做不到,请使用循环并逐个元素分配。

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

    【讨论】:

      【解决方案3】:

      首先std::complex&lt;double&gt;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&lt;dcmplx*&gt;(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);
      

      【讨论】:

      • :它给出了错误:从“double*”类型到“dcmplx*”类型的静态转换无效
      • :这如何适合我的例子?你能举个例子吗?谢谢
      • 检查我更新的答案,它只是一个例子,但我不会在我的最终源代码中使用它,使用 STL 算法找到更优雅的解决方案
      • @demius:好的,为了使用复制,我应该使用向量?这是一个繁重的操作?因为我尝试使用复制但我不确定如何定义例如 D.begin( )。
      • @George 为您很好地实现了一个很好的例子,检查更新的答案,享受:)
      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 2017-07-13
      • 2023-04-01
      • 2016-10-10
      相关资源
      最近更新 更多