许多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)
...
(并且,顺便说一句,维度数据(2 * n)与说它是真实相同吗?)
答案 0 :(得分:7)
我只是写这个答案,因为经验告诉我,一旦我写下这种答案,真正的Fortran专家就会找到一个纠正我的方法。
我不认为当前的标准或其任何前任明确指出complex
将被实现为两个相邻的内存reals
。但是,我认为此实施是equivalence
和common
标准定义的必然结果。我不认为我曾经遇到过complex
没有被实现为reals
对的实现。
虽然可以将complex
转换为reals
对,但标准确实可以保证。所以,给出一些定义:
complex :: z
complex, dimension(4) :: zarr
real :: r1, r2
real, dimension(8) :: rarr
以下将做您可能期望的事情
r1 = real(z)
r2 = aimag(z)
这些功能都是基本的,这里有一个皱纹:
real(zarr)
返回一个4元素的实数数组,就像
一样aimag(zarr)
而
[real(zarr), aimag(zarr)]
是一个8元素的实数数组,其中zarr
的实部后跟复杂的部分。也许
rarr(1:8:2) = real(zarr)
rarr(2:8:2) = aimag(zarr)
对你来说没问题。我不知道有什么更简洁的方法可以做到这一点。
亚历山大并不是唯一能够引用标准的人!他引用的部分让我想知道非默认的复杂标量。所以我继续阅读,我认为他指出我们的第6部分是密切关系
项目(1)中未指定的任何类型的非指针标量对象 - (5) 占用一个未指定的存储单元,每个单元都不同 case和每组类型参数值,这是不同的 第(4)项未指明的存储单元,
我不认为这对这里的任何答案都有任何影响。
答案 1 :(得分:4)
要附加到Mark's answer,标准中确实说明了这一点:条款16.5.3.2"存储顺序":
强调我的。2在存储关联上下文中
[...]
(2)一个双精度实数或非精确对象的非指针标量对象 default complex占用两个连续的数字存储单元,
至于存储关联背景:条款16.5.3.1"一般"读取
1存储序列用于描述存在的关系 变量,公共块和结果变量之间。存储 关联是发生的两个或多个数据对象的关联 当两个或多个存储序列与一个或多个共享或对齐时 更多的存储单元。
因此,var userTable = $('#result').dataTable({
"aaSorting": [],
"bInfo": true,
"oSearch": {"sSearch": ""},
"bAutoWidth": false,
"bLengthChange": false,
"bPaginate": false,
"scrollX": true,
"aoColumns": [
{ "bSearchable": false },
{ "bSearchable": false },
null,
null,
null,
]
});
块,显式common
和结果变量会发生这种情况。如Mark's said,一般情况没有明确的陈述。
我的猜测是,最方便的是始终遵循这一点以确保兼容性。
感谢IanH指出这一点!
答案 2 :(得分:1)
不,据我所知。
您可以通过EQUIVALENCE,COMMON和ENTRY语句在实际单精度数组和复杂单精度数组之间建立存储关联。
但一般情况下,您无法将复杂数组传递给需要实数数组的子例程。