6

我想将复杂数组分配为变量。我的代码就像

        complex indx(3,3)
        integer i,j

        do i=1,3
          do j=1,3
            indx(i,j) = (i,j)                
            write(*,*) indx(i,j)
          end do
        end do

在这种情况下,我收到一个错误,例如

 A symbol must be a defined parameter in this context.   [I]
                       indx(i,j) = (i,j)
4

2 回答 2

9

您必须使用函数cmplx来构建要分配的复杂值。

    complex indx(3,3)
    integer i,j

    do i=1,3
      do j=1,3
       indx(i,j) = cmplx(i,j)               
       write(*,*) indx(i,j)
      end do
    end do

您尝试的语法仅对常量文字有效。

于 2013-06-22T06:50:07.973 回答
3

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那是常量而不是常量表达式

于 2017-01-17T21:41:25.440 回答