我正在尝试将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;
}
这是正确的方法吗?
答案 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);