Vladimir F 的回答说明了重要的部分:for(i,j)
是一个复杂的文字常量i
,并且j
必须是常量。1 如那里所述,内在复数函数cmplx
可用于更一般的情况。
为了提供一些多样性和提供选项,我将看看复杂数组的其他方面。在接下来的示例中,我将忽略输出语句并假设给出的声明。
那么,我们有 Vladimir F 的更正:
do i=1,3
do j=1,3
indx(i,j) = CMPLX(i,j) ! Note that this isn't in array element order
end do
end do
不过,我们可以注意到,这cmplx
是一个基本函数:
do i=1,3
indx(i,:) = CMPLX(i,[(j,j=1,3)])
end do
最重要的是,我们可以考虑
indx = RESHAPE(CMPLX([((i,i=1,3),j=1,3)],[((j,i=1,3),j=1,3)]),[3,3])
这一次,右边是数组元素的顺序indx
。
好吧,我当然不会说最后一个(甚至可能是第二个)比原始循环更好,但它是一种选择。在某些情况下,它可能更优雅。
但我们还有其他选择。如果编译器支持复杂的部分指示符,我们有第一种形式的替代方案:
do i=1,3
do j=1,3
indx(i,j)%re = i
indx(i,j)%im = j
end do
end do
这并没有真正给我们任何东西,但请注意,我们可以拥有数组的复杂部分:
do i=1,3
indx(i,:)%re = [(i,j=1,3)]
indx(i,:)%im = [(j,j=1,3)]
end do
或者
do i=1,3
indx(i,:)%re = i ! Using scalar to array assignment
indx(i,:)%im = [(j,j=1,3)]
end do
我们可以一直到
indx%re = RESHAPE([((i,i=1,3),j=1,3))],[3,3])
indx%im = RESHAPE([((j,i=1,3),j=1,3))],[3,3])
同样,这都是以品种或其他应用程序的名义。其中一些甚至spread
需要考虑。但不要讨厌审查您的代码的人。
1那是常量而不是常量表达式。