Programming Practice

一個 n´n 的帶狀矩陣 (banded matrix) 包含下角和上三角帶狀區,帶寬 (bandwidth) r 的下三角帶狀區即是緊鄰正對角線 (diagonal) 之下的 r 條斜線的元素,帶寬為 s 的上三角帶狀區即是緊鄰正對角線 (diagonal) 之上的 s 條斜線的元素。一個 n´n 的帶狀矩陣只有下三角帶狀區、上三角帶狀區、和正對角線可以有非零的元素,其他的元素皆為零。例如,下列是一個 下三角帶寬為 2,上三角帶寬為 3 的 8´8 矩陣:

A 是一個 n´n 的帶狀矩陣且其下三角和上三角帶寬分別為 rasa,則當 -ra£j-i£sa 時,元素 ai,j 可能是一個非零的元素;其他元素皆為零。若 AB 都是 n´n 的帶狀矩陣,且矩陣 A 的下三角和上三角帶寬分別為 rasa,矩陣 B 的下三角和上三角帶寬分別為 rbsb,則 C=AB 的結果也是一個 n´n 的帶狀矩陣,其下三角和上三角帶寬分別為 ra+rbsa+sb。矩陣 C 的元素可用下列的公式表示:

寫一個 C 語言的程式以執行以下的步驟:

  1. 宣告 AB、和 C 為 100´100 的二維陣列,

  2. 輸入正整數 n 的值 (小於或等於 100),

  3. 輸入帶寬 rasa、rbsc (小於 n 的正整數)

  4. 使用副程式 rand() 隨機產生矩陣 A B 非零元素的值 (假設AB 元素的值在 1 和 100 之間),

  5. 計算矩陣 C 元素的值,

  6. 輸出矩陣 AB、和 C (只輸出非零的元素)。

將帶狀矩陣乘法寫成副程式 void matrix_product_banded(int n, int ra, int rb, int sa, int sb, int A[100][100], int B[100][100], int C[100][100]). 以下為程式執行範例:

Enter matrix size n: 10

Enter the lower bandwidth of matrix A, ra: 3

Enter the upper bandwidth of matrix A, sa: 2

Enter the lower bandwidth of matrix B, rb: 4

Enter the upper bandwidth of matrix B, sb: 1

Matrix A:
    70 89 68
    45 10 67  8
    35 35 78 10 74
    23 32 47 25 75 75
       30 14 67 25 13 20
           7 26 36 37 32 34
             90 47 39 65 48 17
                72 15 71 37 15 41
                   14 57 72  9 15
                      54 97 93 44

Matrix B:
    61 96
    31 65 69
    64 28 80 43
    16 10 66 84 87
    78 52 96 59 78 99
       99 16 91 48 57 47
          31 39 94 86 69 91
             71 78 40 75 50 28
                 9 98 44 96 11 80
                   57 27 49 51 99

Matrix C:
    11381 14409 11581  2924
     7471  6926  6578  3553   696
    14144 11767 16419  8560  6642  7326
    11653 17179 16018 15371 11625 11700  3525
     4848  5599 10840  9668 10283  4936  1991  1820
     3672  5991  7316 11638 12506  9785  6497  4612   952
     5106  7205 13091 19825 23375 16052 10666  9947  1531  1360
     5616  5229  9353 11009 16031 19376 10146 11760  3292  5259
           1386  1991  8609 11727 10317 10792 10386  2880  2205
                 1674  8993 13479 20146 16281 20848  5983 11796