将变量编号分配给复杂数组

时间:2013-06-22 04:24:25

标签: fortran complex-numbers

我想将复数数组指定为变量。 我的代码就像

        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)

2 个答案:

答案 0 :(得分:6)

您必须使用函数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

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

答案 1 :(得分:-1)

弗拉基米尔F的回答说明了重要的部分:因为(i,j)是一个复杂的文字常量ij必须是常数。 1 如上所述在那里,内在的复杂函数cmplx可以用于更一般的情况。

为了提供多种选择和提供选项,我将介绍复杂数组的其他方面。在下面的例子中,我将忽略输出语句并假设给出的声明。

然后,弗拉基米尔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 那是constants not constant expresssions