许多FFT算法利用存储在阵列中交替的实部和虚部的复数.通过创建一个COMPLEX数组并将其传递给FFT例程,是否可以保证它可以使用交替的实部和虚部组件转换为REAL数组(大小的两倍)?
subroutine fft (data, n, isign)
dimension data(2*n)
do 1 i=1,2*n,2
data(i) = ..
data(i+1) = ..
1 continue
return
end
...
complex s(n)
call fft (s, n, 1)
...
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,维度数据(2*n)与说它是真实相同吗?)
我只是写这个答案,因为经验告诉我,一旦我写下这种答案,真正的Fortran专家就会找到一个纠正我的方法.
我不认为当前的标准,也没有任何前任,明确指出a complex
将被实现为两个相邻的内存reals
.但是,我认为这是执行的标准的定义的必然结果equivalence
和common
.我不认为我曾经遇到过一个实现,其中a complex
没有被实现为一对reals
.
标准确实保证,尽管a complex
可以转换成一对reals
.所以,给出一些定义:
complex :: z
complex, dimension(4) :: zarr
real :: r1, r2
real, dimension(8) :: rarr
Run Code Online (Sandbox Code Playgroud)
以下将做你可能期望的事情
r1 = real(z)
r2 = aimag(z)
Run Code Online (Sandbox Code Playgroud)
这两个功能都是基本的,这里有一个皱纹:
real(zarr)
Run Code Online (Sandbox Code Playgroud)
返回一个4元素的实数数组,就像这样
aimag(zarr)
Run Code Online (Sandbox Code Playgroud)
而
[real(zarr), aimag(zarr)]
Run Code Online (Sandbox Code Playgroud)
是一个8元素的实数数组,其中zarr
包含复杂部分的实部.也许
rarr(1:8:2) = real(zarr)
rarr(2:8:2) = aimag(zarr)
Run Code Online (Sandbox Code Playgroud)
会对你好的.我不确定是否有任何更简洁的方法来做到这一点.
亚历山大并不是唯一能够引用标准的人!他引用的部分让我想知道非默认的复杂标量.所以我继续阅读,我认为他指出我们的第6段是密切相关的
(1) - (5)中未指定的任何类型的非指针标量对象占用单个未指定的存储单元,该存储单元对于每种情况和每组类型参数值是不同的,并且与项目的未指定存储单元不同( 4),
我不认为这对这里的任何答案都有任何影响.