2014-02-21 39 views
0

我正试图将双倍*复杂*。 我只是有一个2×2矩阵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; 

} 

这是做正确的方式?

+0

我建议你检查一个['std :: complex'引用](http://en.cppreference.com/w/cpp/numeric/complex),注意[赋值运算符](http:///en.cppreference.com/w/cpp/numeric/complex/operator%3D)。 –

回答

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


UPDATE:为你准备了一个很好的例子,由于享受C++ 11 :)

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); 
+0

:它给出了错误:无效的static_cast从'double *'类型输入'dcmplx * – George

+0

:这将如何适合我的例子?你能举一个例子吗?谢谢 – George

+0

检查我更新的答案,它只是一个例子,但我会不要在我的最终源代码中使用它,使用STL算法找到更优雅的解决方案 – deimus

1

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

同样,*C也不是数组。

你在做什么是将D[0]分配到C[0]。因为complex有合适的赋值运算符,所以不需要为此进行投射。

由于指向的类型不相关,因此不能将double*转换为std::complex<double>*。我想最简单的方法就是使用std::copy
如果你不能这样做,使用一个循环,并按元素分配元素。

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

1

,你可以投一个复杂的阵列到阵列的两倍, 见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());

这是非常方便的。