8 多維陣列

8.1 多註標變數

許多問題所涉及的資料,往往可以用表格方式表示。 例如下表 為某校各年級各科的平均成績。

年級 \ 科目 國文 英文 數學 理化
一年級 75.8 80.1 70.6 78.3
二年級 85.5 81.8 69.4 76.6
三年級 88.2 83.1 73.9 82.9

表中這十二項資料可以方便地使用二維陣列儲存。 陣列的宣告如下,

       DIMENSION SCORE(3,4)
       REAL SCORE

或
       REAL SCORE(3,4)

雙註標的變數 SCORE(2,3) 代表第二列第三行的資料, 即二年級的平均數學成績。 一般而言, SCORE(I,J) 代表第 I 列第 J 行的資料。

多組格式相同的表格可以用三維陣列表示。 例如,

       REAL SCORE(3,4,50)

多維陣列的宣告方式,依此類推。

8.2 多維陣列的處理

處理一維陣列中每項資料的自然次序是循序由第一項 到最後一項, 即其唯一的註標採取遞增或遞減的方式。 然而對多維陣列而言,卻有多種次序。 多維陣列有多個註標,每個註標都可以變動。 因此變動各個註標的次序就有多種。

二維陣列有二個註標,第一個代表列,第二個代表行。 因此處理二維陣列各個註標的次序就有二種。 先變動第二個註標,再變動第一個註標,稱為依列 (rowwise) 次序。 換句話說,即先處理第一列的各 項資料,再處理第二列,依此次序,直到最後一列。
以上述陣列 SCORE(3,4) 為例, 其處理次序如下,

    SCORE(1,1), SCORE(1,2), SCORE(1,3), SCORE(1,4),
    SCORE(2,1), SCORE(2,2), SCORE(2,3), SCORE(2,4),
    SCORE(3,1), SCORE(3,2), SCORE(3,3), SCORE(3,4)

先變動第一個註標,再變動第二個的,稱為依行 (columnwise) 次序。即先處理第一行的各 項資料,再處理第二行,依此次序,直到最後一行。
再以上述 SCORE(3,4) 為例, 其處理次序如下,

    SCORE(1,1), SCORE(2,1), SCORE(3,1),
    SCORE(1,2), SCORE(2,2), SCORE(3,2),
    SCORE(1,3), SCORE(2,3), SCORE(3,3),
    SCORE(1,4), SCORE(2,4), SCORE(3,4)

假如沒有規定次序,例如在輸出/輸入串列中使用陣列名稱, 依照 FORTRAN 慣例,二維陣列依行次序處理

使用 DO 迴圈

      INTEGER LEVEL, LIMIT
      PARAMETER(LEVEL = 4, LIMIT = 50)
      REAL SCORE(LEVEL, LIMIT)
      INTEGER I, J

      DO 20 I = 1, LEVEL
         DO 10 J = 1, LIMIT
            READ *, SCORE(I, J)
   10    CONTINUE
   20 CONTINUE

使用陣列名稱

      INTEGER SCORE(3,4)
      READ *, SCORE

使用隱式 DO 迴圈

      READ *, (( SCORE(I,J), J = 1, LIMIT), I=1, LEVEL)

例題: TEMPS (source)

當做引數

上一章談到副程式可以使用一維陣列做為引數,同樣可以使用多維陣列做為引數。 同樣實際引數和形式引數,都必須有陣列宣告。

8.3 例題 :

  1. Pollution report:  POLLUT (source)
  2. Oceanographic data analysis:  OCEAN (source)

8.4 矩陣

含有 m 列和 n 行數值的二維陣列, 稱為 m x n 矩陣 (matrix)。

矩陣相等

兩個矩陣 A 和 B 相等,寫成 A = B, 假如

  1. A 的列數和 B 的列數相同, 而且A 的行數也和 B 的行數相同。
  2. A 的每一項和 B 相對應的每一項相等。

矩陣加減,純量相乘

假設 Aij 和 Bij 分別為 m x n 矩陣 A 和 B 的第 i 列和第 j 行的項目, 則 A + B 的第 i 列和第 j 行的項目為 Aij + Bij

同樣地, A - B 的第 i 列和第 j 行的項目為 Aij - Bij
純量 c 和 m x n 矩陣 A 相乘, 其乘積矩陣 cA 的第 i 列和第 j 行的項目為 cAij

以下是處理矩陣相加的 FORTRAN 副程式, 略為修改即可處理矩陣相減和純量相乘。

      SUBROUTINE MATSUM(A, B, C, LIMIT, M, N)

      INTEGER LIMIT, M, N, I, J
      REAL A(LIMIT, LIMIT), B(LIMIT, LIMIT), C(LIMIT, LIMIT)

      DO 20 I = 1, M
         DO 10 J = 1, N
            C(I,J) = A(I,J) + B(I,J)
   10    CONTINUE
   20 CONTINUE
      END

矩陣相乘

假設 A 為 m x n 矩陣, B 為 n x p 矩陣。 注意 A 的行數必須 等於 B 的列數。 則乘積 AB 為一 m x p 矩陣, 其第 i 列和第 j 行的項目為

       Ai1B1j + Ai2B2j + ... + AinBnj

以下是處理矩陣相乘的 FORTRAN 副程式。

      SUBROUTINE MATMUL(A, B, C, LIMIT, M, N, P)

      INTEGER LIMIT, M, N, P, I, J, K
      REAL A(LIMIT, LIMIT), B(LIMIT, LIMIT), C(LIMIT, LIMIT)

      DO 30 I = 1, M
         DO 20 J = 1, N
            C(I,J) = 0.0
            DO 10 K = 1, P
               C(I,J) = C(I,J) + A(I,K) * B(K,J)
   10       CONTINUE
   20    CONTINUE
   30 CONTINUE
      END

FORTRAN 90 特色

處理矩陣可用下列預先界定的函數:

    MAXVAL(A)
    MINVAL(A)
    MAXLOC(A)
    MINLOC(A)
    PRODUCT(A)
    SIZE(A)
    SUM(A)
    MATMUL(A, B)
    TRANSPOSE(A)