在Fortran中,我有一个类型为real的{1}数组,real :: work(2*N)
,表示N
复数。我对阵列的声明没有任何影响。
后来我需要在work
上应用复杂的共轭。但是,conjg(work(:))
不起作用,因为它是真实的类型。
是否有一种有效的方法可以说服编译器将conjg
应用于我的数组?
答案 0 :(得分:3)
最简单的方法已经在HighPerformanceMark的评论中,只是将表示虚部的元素乘以-1。
您还可以在实数组和复数数组之间使用equivalence
。它将只是一个阵列,但被视为真实和复杂。可能不是严格的标准符合(不确定),但只要N
不变就可以工作。
等价用作:
real :: work(2*N)
complex :: cwork(N)
!both work and cwork point to the same data
equivalence (work, cwork)
work = some_initial_value
!this conjugates work at the same time as cwork because they are just different names for the same array
cwork = conjg(cwork)
答案 1 :(得分:2)
使用复变量COMPLEX :: temp(N)
并对其应用共轭。然后,您可以使用REAL(temp)
和AIMAG(temp)
剖析真实和复杂的部分并将它们放回工作数组中。
可能最好从一开始就使work
成为复杂类型。