Fortran - 我不理解变量声明

时间:2014-12-08 01:06:37

标签: arrays fortran

我需要分析一些Fortran代码

         subroutine ilocz (a,b,c,n,m)
         real a(n,n),b(n,m),c(n,m)
         do 1 i=1,n
         do 2 j=1,m
         c(i,j)=0
         do 3 k=1,n
   3     c(i,j)=c(i,j)+a(i,k)*b(k,j)
   2     continue
   1     continue
         return
         end

在其他地方我称之为

call ilocz (a(n11),y(2),a(n12),n,1)

我应该参考ilocz 5变量 - a,b,c,n,m。 没关系。但在ilocz的第一行是数组的声明。它们的名称与我的方法参数相同。

当我调用ilocz时,我将5个实数(不是数组)引用到方法中。 怎么可能?它是如何工作的?

也许这个数字分配给每个数组元素(a(11)到a(n,n),y(2)到b(n,m),a(n12)到c(n,m))或什么?

有人可以向我解释一下吗? 提前谢谢。

1 个答案:

答案 0 :(得分:4)

这是相同的代码,只是现代化。如您所见,它需要abc的实数数组,但FORTRAN非常棒,因为您可以处理数组之类的标量

pure subroutine ilocz (a,b,c,n,m)
implicit none
! Arguments
integer, intent(in) :: n,m
real, intent(in)    :: a(n,n),b(n,m)
real, intent(out)   :: c(n,m)
! Local Vars
integer :: i,j,k
do i=1,n
    do j=1,m
    c(i,j)=0
        do k=1,n
          c(i,j)=c(i,j)+a(i,k)*b(k,j)
        end do
    end do
end do
return
end

我们可以称之为

call ilocz(a(1,1),b,a(2,1),1,1)

a的第一个元素,b的第一个元素,并写入a的第二个元素。

修改

您还可以使用以下代码:

do i=1,n
    do j=1,m
      c(i,j)=DOT_PRODUCT(a(i,1:n),b(1:n,i)
    end do
end do

甚至

c = MATMUL(a,b)

请参阅Fortran matrix multiplication performance in different optimization进行性能比较,了解不同的方法