10. ¹è¿­(Arrays)

°úÇÐ ºÐ¾ßÀÇ °è»ê¿¡¼­´Â vector³ª matrix¸¦ »ç¿ëÇÑ´Ù. Fortran¿¡¼­ ÀÌ·¯ÇÑ °æ¿ì »ç¿ëÇÒ ¼ö ÀÖ´Â ÀÚ·á ÇüÅ°¡ ¹è¿­((EM>array)ÀÌ´Ù. ÀÏÂ÷¿ø ¹è¿­·Î vector¸¦, ÀÌÂ÷¿ø ¹è¿­·Î matrix¸¦ ³ªÅ¸³½´Ù. To fully understand how this works in Fortran 77¿¡¼­ ÀÌ°ÍÀÌ ¾î¶»°Ô ÀÛµ¿Çϴ°¡¸¦ ¿ÏÀüÈ÷ ÀÌÇØÇϱâ À§ÇÏ¿©´Â »ç¿ë synatx »Ó¸¸ ¾Æ´Ï¶ó Fortran 77¿¡¼­ ÀÌ°ÍÀ» memory¿¡ ¾î¶»°Ô ÀúÀåÇϴ°¡µµ ¾Ë¾Æ¾ß ÇÑ´Ù.

ÀÏÂ÷¿ø ¹è¿­ (One-dimensional arrays)

°¡Àå °£´ÜÇÑ ¹è¿­Àº ÀÏÂ÷¿ø ¹è¿­·Î ÇØ´ç ¿ø¼Ò¸¦ memory¿¡ ÀÏÂ÷¿ø ¼ø¼­¿¡ µû¶ó ¿¬¼ÓÀûÀ¸·Î ÀúÀåµÇ¾î ÀÖ´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î
      real a(20)
´Â ±æÀÌ°¡ 20ÀÎ ½Ç¼ö ¹è¿­a¸¦ ¼±¾ðÇÑ´Ù. Áï a´Â memory¿¡ ¿¬¼ÓÀûÀ¸·Î ÀúÁ¤µÇ¾î ÀÖ´Â 20 °³ÀÇ ½Ç¼ö¸¦ ÀǹÌÇÑ´Ù. ±ÔÁ¤¿¡ ÀÇÇÏ¿© Fortran ¹è¿­Àº 1ºÎÅÍ ¹øÈ£ ¸Å°ÜÁø´Ù. µû¶ó¼­ ¹è¿­ÀÇ Ã¹¹ø° ¼ýÀÚ´Â a(1)ÀÌ°í ¸¶Áö¸·Àº a(20)ÀÌ´Ù. ±×·¯³ª ´ÙÀ½°ú °°ÀÌ ÇÏ¸é ¼ø¼­ÀÇ ¹üÀ§¸¦ ¸¶À½´ë·Î Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.
      real b(0:19), weird(-162:237)
¿©±â¼­ b´Â ¼ø¼­°¡ 0ºÎÅÍ 19±îÁöÀÎ °ÍÀ» Á¦¿ÜÇÏ°í´Â ¾ÕÀÇ ¿¹ÀÇ a¿Í ¶È °°´Ù. weird´Â ±æÀÌ°¡ 237-(-162)+1 = 400ÀÎ ¹è¿­ÀÌ´Ù.

¹è¿­ÀÇ ¿ø¼ÒÀÇ ÇüÅ´ ´Ù¸¥ ±âº»ÀûÀÎ dataÀÇ Çü½Ä ÁßÀÇ ÇϳªÀÌ´Ù. ¿¹:

      integer i(10)
      logical aa(0:1)
      double precision x(100)

ÇÑ ¹è¿­ÀÇ ´Ù¸¥ ¿ø¼Ò´Â °¢°¢ µ¶¸³ÀûÀÎ º¯¼ö·Î »ý°¢ÇÒ ¼ö ÀÖ´Ù. ¹è¿­ aÀÇ i¹ø° ¿ø¼Ò´Â a(i)·Î ³ªÅ¸³½´Ù. ´ÙÀ½Àº ¹è¿­ sq¿¡ 10 °³ÀÇ ¼ýÀÚÀÇ Á¦°öÀ» ÀúÀåÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù.

      integer i, sq(10)

      do 100 i = 1, 10
         sq(i) = i**2
  100 continue

Fortran¿¡¼­ ÈçÈ÷ ¹üÇÏ´Â À߸øÀº ¹üÀ§ ¹ÛÀ̰ųª Á¤ÀÇÇÏÁö ¾ÊÀº ¹è¿­ÀÇ ¿ø¼Ò¸¦ °¡¸®Å°´Â ÀÏÀÌ´Ù. ÀÌ´Â ÇÁ·Î±×·¡¸Ó°¡ ¾Ë¾Æ¼­ ÇÒ ÀÏÀ̸ç Fortran compiler ´Â ÀÌ·± À߸øÀ» ¾Ë ¼ö ¾ø´Ù!

ÀÌÂ÷¿ø ¹è¿­(Two-dimensional arrays)

matrix´Â ¼±Çü ´ë¼ö(linear algebra)¿¡¼­ ¸Å¿ì Áß¿äÇÏ´Ù. º¸Åë ÀÌÂ÷¿ø ¹è¿­·Î matrix¸¦ ³ªÅ¸³½´Ù. ¿¹¸¦ µé¾î
      real A(3,5)
Àº 3*5=15 °³ÀÇ ½Ç¼ö¸¦ °¡¸®Å°´Â ÀÌÂ÷¿ø ¹è¿­À» Á¤ÀÇÇÑ´Ù. óÀ½ ¼ýÀÚ´Â ¿­(row)¸¦ °¡¸®Å°´Â ¼ýÀÚ·Î µÎ¹ø°´Â Çà(column)À» °¡¸®Å°´Â ¼ýÀÚ·Î »ý°¢ÇÑ´Ù. À̸¦ ±×¸²À¸·Î ³ªÅ¸³»¸é ´ÙÀ½°ú °°´Ù.
   (1,1)  (1,2)  (1,3)  (1,4)  (1,5)
   (2,1)  (2,2)  (2,3)  (2,4)  (2,5)
   (3,1)  (3,2)  (3,3)  (3,4)  (3,5)
ÀÌÂ÷¿ø ¹è¿­µµ ±× ¹üÀ§¸¦ ÀÓÀÇ·Î Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ÀϹÝÀû syntax´Â ´ÙÀ½°ú °°´Ù.
     name (low_index1 : hi_index1, low_index2 : hi_index2)
¹è¿­ÀÇ Àüü Å©±â´Â ´ÙÀ½°ú °°´Ù.
     size = (hi_index1-low_index1+1)*(hi_index2-low_index2+1)

Fortran¿¡¼­´Â ÀúÀåÇÏ°íÀÚÇÏ´Â matrixº¸´Ù Å« ¹è¿­À» ¼±¾ðÇÏ´Â °ÍÀÌ º¸ÅëÀÌ´Ù. (ÀÌ´Â Fortran¿¡¼­´Â dynamic storage allocationÀ» ÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù.) ´ÙÀ½Àº À߸øµÇÁö ¾ÊÀº °ÍÀÌ´Ù. ¿¹:

      real A(3,5)
      integer i,j
c
c     We will only use the upper 3 by 3 part of this array.
c
      do 20 j = 1, 3
         do 10 i = 1, 3
            a(i,j) = real(i)/real(j)
   10    continue
   20 continue
ºÎ¹è¿­ A(1:3,4:5)ÀÇ ¿ø¼Ò °ªÀº Á¤ÀǵÇÁö ¾Ê¾Ò´Ù. compiler°¡ ÀÌ ¿ø¼ÒÀÇ ÃʱⰪÀ» 0À¸·Î ¼³Á¤ÇÒ °ÍÀ̶ó°í °¡Á¤ÇÏÁö ¸»¶ó. (¾î¶² compiler¿¡¼­´Â 0À¸·Î ¼³Á¤ÇÏÁö¸¸ ÇÏÁö¸¸ ¸ðµç compiler°¡ ±×·¸Áö ¾Ê´Ù.).

ÀÌÂ÷¿ø ¹è¿­ÀÇ ÀúÀå Çü½Ä(Storage format for 2-dimensional arrays)

Fortran¿¡¼­´Â ÀÏÂ÷¿ø ÀÌ»óÀÇ ¹è¿­µµ ±× ¿ø¼Ò¸¦ ²÷ÀÓ¾øÀÌ ¿¬¼ÓÀûÀÎ(contiguous) ÀÏÂ÷¿øÀ¸·Î ÀúÀåÇÑ´Ù. ÀÌÂ÷¿ø ¹è¿­Àº Çà column¿¡ µû¶ó ¹è¿­µÈ´Ù´Â °ÍÀ» ¾Ë¸é ÁÁ´Ù. ¾ÕÀÇ ¿¹¿¡¼­ ¹è¿­ÀÇ ¿ø¼Ò (1,2)°¡ ¿ø¼Ò (3,1) ´ÙÀ½¿¡ ÀúÀåµÈ´Ù. ±×¸®°í µÑ° ÇàÀÇ ³ª¸ÓÁö ±× µÚ¿¡ ¼¸Â° ÇàÀÌ ÀúÀåµÈ´Ù.

3 by 5ÀÇ ¹è¿­ A(3,5)ÀÇ À§ÂÊ 3 by 3 ºÎ¹è¿­¸¸ »ç¿ëÇÏ´Â ¿¹¸¦ ´Ù½Ã »ìÆ캸¸é °ü½ÉÀÌ ÀÖ´Â 9 °³ÀÇ elements´Â óÀ½ 9 °³ÀÇ memory¿¡ ÀúÀåµÇ°í ³ª¸ÓÁö 6°³´Â »ç¿ëÇÏÁö ¾Ê´Â´Ù. leading dimensionÀº ¹è¿­¿¡¼­³ª ¹è¿­¿¡ ÀúÀåÇÑ matrix¿¡¼­³ª ¶È °°´Ù. ±×·¯³ª Á¾Á¾ ¹è¿­ÀÇ leading dimensionÀÌ matrixÀÇ Ã¹¹ø° Â÷¿øº¸ÀÚ Å¬ ¼ö ÀÖ´Ù. ±× °æ¿ì¿¡´Â ¹è¿­Àº ¿¬¼ÓÀûÀ̶ó ÇÏ´õ¶óµµ matrix´Â memory¿¡ ¿¬¼ÓÀûÀ¸·Î ÀúÀåµÇÁö ¾Ê´Â´Ù. ¿¹¸¦ µé¾î A(5,3)À̶ó°í ¼±¾ðÇÏ¿´´Ù¸é ÇÑ ÇàÀÇ ³¡°ú ´ÙÀ½ ÇàÀÇ ½ÃÀÛ »çÀÌ¿¡ "»ç¿ëÇÏÁö ¾Ê´Â" memory°¡ µÎ °³ ÀÖ°Ô µÈ´Ù. (matrix´Â 3 by 3À̶ó°í °¡Á¤).

ÀÌ·± »ç½ÇÀº º¹ÀâÇÑ °Í °°Áö¸¸ Àͼ÷ÇÏ¿©Áö¸é ´ë´ÜÈ÷ ´Ü¼øÇÏ´Ù. Àǽɽº·¯¿ì¸é ¹è¿­ ¿ø¼ÒÀÇ ÁÖ¼Òaddress¸¦ »ìÆ캸¸é ÁÁ´Ù. °¢°¢ÀÇ ¹è¿­Àº ¹è¿­ÀÇ Ã¹¹ø° Áï ¿ø¼Ò (1,1)°¡ ¾î¶² memory ÁÖ¼Ò¿¡ ¹èÁ¤µÇ¾î ÀÖ´Ù. element (i,j)ÀÇ ÁÖ¼Ò´Â then given by

      addr[A(i,j)] = addr[A(1,1)] + (j-1)*lda + (i-1)
¿©±â¼­ lda´Â AÀÇ leading (i.e. column) dimensionÀÌ´Ù. º¸Åë ldaÀº ½ÇÁ¦ matrix Â÷¿ø°ú´Â ´Ù¸£´Ù´Â Á¡¿¡ ÁÖÀÇÇÑ´Ù. ÀÌ·± ·ùÀÇ FortranÀÇ ¿À·ù°¡ ´ë´ÜÈ÷ ¸¹À¸¸ç µû¶ó¼­ ÀÌ Â÷À̸¦ ÀÌÇØÇÏ¿©¾ß ÇÑ´Ù!

´ÙÂ÷¿ø ¹è¿­(Multi-dimensional arrays)

Fortran 77¿¡¼­´Â ¹è¿­ÀÇ Â÷¿øÀ» 7Â÷¿ø±îÁö ÇÒ ¼ö ÀÖ´Ù. syntax¿Í ÀúÀå Çü½ÄÀº ÀÌÂ÷¿øÀÇ °æ¿ì¿Í À¯»çÇÏ´Ù.

dimension ¹®(The dimension statement)

Fortran 77¿¡¼­ ¹è¿­À» ¼±¾ðÇÏ´Â ´Ù¸¥ ¹æ¹ýÀÌ ÀÖ´Ù.
      real A, x
      dimension x(50)
      dimension A(10,20)
˼
      real A(10,20), x(50)
°ú °°´Ù. ¿À´Ã³¯¿¡´Â ÀÌ dimension ¹®Àº ±¸½ÄÀÌ´Ù.


Exercises

Exercise A
´ÙÀ½ÀÇ main ÇÁ·Î±×·¥À» ÀÛ¼ºÇ϶ó. matrix A¸¦ ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇ϶ó.
       integer nmax
       parameter (nmax=40)
       real A(nmax, nmax)
¾Ë¸Â´Â vector x¿Í y¸¦ Á¤ÀÇÇÏ°í 1<=i<=m , 1<=j<=nÀÇ ¹üÀ§¿¡¼­ (´Ü m=10, n=20) A(i,j) = i+j-2·Î ÃʱâÈ­Ç϶ó. ¶Ç 1<=j<=n¿¡¼­ x(j) = 1·Î ÃʱâÈ­Ç϶ó. º»¹®¿¡ ÁÖ¾îÁø matvec subroutineÀ» »ç¿ëÇÏ¿© y=A*x¸¦ °è»êÇ϶ó. °á°ú y¸¦ ÀμâÇ϶ó.

Exercise B
scalar product y = A*x¸¦ ÇàÇÏ´Â subroutineÀ» ½á¶ó. ´Ü °¡Àå ¾ÈÂÊ loopÀÇ index´Â j·Î Ç϶ó. Exercise AÀÇ ¿¹¸¦ »ç¿ëÇÏ¿© code¸¦ °Ë»çÇÏ°í ±× °á°ú¸¦ ºñ±³Ç϶ó.


[Fortran Tutorial]
Ãæ³²´ëÇб³ ¹°¸®Çаú ¿À º´¼º