回 帖 发 新 帖 刷新版面

主题:关于forall的一个程序,想不通

在Fortran95上看了一个程序,关于forall的,如下:
program ex0714
implicit none
  integer I,J
  integer, parameter :: size = 5
  integer :: a(size,size)

  forall ( I=1:size, J=1:size, I>J )  a(I,J)=1 ! 上半部分
  forall ( I=1:size, J=1:size, I==J ) a(I,J)=2 ! 对角线部分
  forall ( I=1:size, J=1:size, I<J )  a(I,J)=3 ! 下半部分

  open (111,file="e:\ex0714.txt")
  write(111,"(5(5I5,/))") a

  stop
end

输出结果为:
    2    1    1    1    1
    3    2    1    1    1
    3    3    2    1    1
    3    3    3    2    1
    3    3    3    3    2

请教:对forall循环的部分,i、j到底是如何循环的?貌似跟一般数组的赋值不一样。想不明白。请高手指点。

回复列表 (共4个回复)

沙发

很难理解吗?我怎么不觉得呢??貌似很直观啊

板凳


我觉得是循环过程中,满足最后条件的就执行,和一般的循环里插if语句差不多~~

3 楼


    2    1    1    1    1
    3    2    1    1    1
    3    3    2    1    1
    3    3    3    2    1
    3    3    3    3    2
这个矩阵用a(i,j)来表示的话,是这样吧:
a(1,1) a(1,2) a(1,3) a(1,4) a(1,5) 
a(2,1) a(2,2) a(2,3) a(2,4) a(2,5)
a(3,1) a(3,2) a(3,3) a(3,4) a(3,5)
a(4,1) a(4,2) a(4,3) a(4,4) a(4,5)
a(5,1) a(5,2) a(5,3) a(5,4) a(5,5)
程序里写的是  forall ( I=1:size, J=1:size, I>J )  a(I,J)=1 ! 上半部分
明明上半部分是i<j。这就是我不理解的地方。

4 楼


fortran里边数组是列优先存放在cpu里的,输出时同样是先输出列
即A(1,1),A(2,1),A(4,1),A(4,1),……

我来回复

您尚未登录,请登录后再回复。点此登录或注册