2010-03-15 92 views
1

我在作業中遇到了這個問題。我已經做到了這一點,並確定問題出在我的三個for循環中。這個問題直接說使用3 for循環,所以我知道這可能只是一個邏輯錯誤。C中的5x5矩陣乘法

#include<stdio.h> 

void matMult(int A[][5],int B[][5],int C[][5]); 
int printMat_5x5(int A[5][5]); 

int main() { 

int A[5][5] = {{1,2,3,4,6}, 
     {6,1,5,3,8}, 
     {2,6,4,9,9}, 
     {1,3,8,3,4}, 
     {5,7,8,2,5}}; 

int B[5][5] = {{3,5,0,8,7}, 
     {2,2,4,8,3}, 
     {0,2,5,1,2}, 
     {1,4,0,5,1}, 
     {3,4,8,2,3}}; 

int C[5][5] = {0}; 

matMult(A,B,C); 

printMat_5x5(A); 
printf("\n"); 

printMat_5x5(B); 
printf("\n"); 

printMat_5x5(C); 

return 0; 

} 

void matMult(int A[][5], int B[][5], int C[][5]) 
{ 
int i; 
int j; 
int k; 

for(i = 0; i <= 2; i++) { 
    for(j = 0; j <= 4; j++) { 
    for(k = 0; k <= 3; k++) { 
    C[i][j] += A[i][k] * B[k][j]; 
    } 
    } 
} 

} 

int printMat_5x5(int A[5][5]){ 

int i; 
int j; 

for (i = 0;i < 5;i++) { 
    for(j = 0;j < 5;j++) { 

    printf("%2d",A[i][j]); 
    } 

    printf("\n"); 
} 

} 

編輯: 這裏是問題,抱歉沒有發佈它的第一次。

寫一個C函數來乘以兩個五乘五矩陣。原型系統應該讀

void matMult(int a[][5],int b[][5],int c[][5]); 

所得矩陣乘積(ab)二維陣列c在被返回(函數的第三個參數)。使用三個嵌套for循環編程您的解決方案(每個生成計數器值爲0,1,2,3,4)也就是說,不要在問題中爲5乘5的情況編寫特定的公式,但要使代碼一般很容易被改變來計算更大的方陣的乘積。使用陣列

a: 
1 2 3 4 6 
6 1 5 3 8 
2 6 4 9 9 
1 3 8 3 4 
5 7 8 2 5 
b: 
3 5 0 8 7 
2 2 4 8 3 
0 2 5 1 2 
1 4 0 5 1 
3 4 8 2 3 

打印使用五點矩陣印刷5創造了一個C函數你在一個整潔格式矩陣寫主要程序來測試你的函數。打印所有三個矩陣。使用C數組初始化功能在主程序中生成測試數組。

+2

您是否有真正的問題?我不確定你在找什麼。 – Gabe 2010-03-15 01:52:32

+2

請記住,對於產品中的給定索引'i,j',可以取第一個矩陣的第i行,第二個矩陣的第j列,然後乘以所有的'兩組中的數字對。爲什麼你的指數變量分別持續到2,4和3?你從哪裏得到這些數字? – 2010-03-15 01:53:24

+0

我希望我可以倒下教授浪費他們的學生時間,當他們可以專注於一些事實上會促進他們大學畢業後的事業。 – 2010-03-15 01:56:38

回答

4

爲什麼你的printMat_5x5循環具有條件i < 5j < 5,但你的matMult循環具有條件i <= 2j <= 4k <= 3

+0

你也可能會發現它很適合初始化C到* matMult內的零。沒有意義強制另一步設置到調用方(將目標數組設置爲全零)。 – paxdiablo 2010-03-15 02:12:19

+0

好吧,因爲printMat_5x5函數只需要打印5x5矩陣,並且問題指出matMult必須具有計數器值1,2,3,4和5 – Rick 2010-03-15 02:13:27

+2

@Rick,該短語要求計數器值爲0,1 ,2,3,4。這意味着「for(i = 0; i <5; i ++)...」。換句話說,*每個*計數器必須從0到4運行,而不是(如你所想),一個運行到1,另一個運行到2,另一個運行到3,依此類推。 – paxdiablo 2010-03-15 02:24:49

4

matMult()中,由於您乘以5x5矩陣,所有循環限制應爲5。另外,使用慣用的for (i = 0; i < dimension; i++)而不是for (i = 0; i <= dimension_minus_one; i++)


我從下面的程序得到的輸出是:

Matrix A: 
    1, 2, 3, 4, 6 
    6, 1, 5, 3, 8 
    2, 6, 4, 9, 9 
    1, 3, 8, 3, 4 
    5, 7, 8, 2, 5 
Matrix B: 
    3, 5, 0, 8, 7 
    2, 2, 4, 8, 3 
    0, 2, 5, 1, 2 
    1, 4, 0, 5, 1 
    3, 4, 8, 2, 3 
Matrix C: 
    29, 55, 71, 59, 41 
    47, 86, 93, 92, 82 
    54, 102, 116, 131, 76 
    24, 55, 84, 63, 47 
    46, 83, 108, 124, 89 

我使用的代碼是這樣的:

#include <stdio.h> 

static int matmul(size_t ax, size_t ay, int a[ax][ay], 
        size_t bx, size_t by, int b[bx][by], 
        size_t cx, size_t cy, int c[cx][cy]) 
{ 
    if (ay != bx || ax != cx || by != cy) 
     return(-1); /* Non-compatible matrices */ 

    size_t i, j, k; 

    /* Zero result */ 
    for (i = 0; i < cx; i++) 
    { 
     for (j = 0; j < cy; j++) 
      c[i][j] = 0; 
    } 

    /* Compute result - no care about overflows */ 
    for (i = 0; i < ax; i++) 
    { 
     for (j = 0; j < by; j++) 
     { 
      for (k = 0; k < ay; k++) 
       c[i][j] += a[i][k] * b[k][j]; 
     } 
    } 

    return(0); 
} 

static void matminmax(size_t ax, size_t ay, int a[ax][ay], 
         int *pmin, int *pmax) 
{ 
    size_t i, j; 
    int max = a[0][0]; 
    int min = a[0][0]; 
    for (i = 0; i < ax; i++) 
    { 
     for (j = 0; j < ay; j++) 
     { 
      if (a[i][j] > max) 
       max = a[i][j]; 
      else if (a[i][j] < min) 
       min = a[i][j]; 
     } 
    } 
    *pmin = min; 
    *pmax = max; 
} 

static void set_printformat(const char *pfx, const char *sfx, 
          size_t ax, size_t ay, int a[ax][ay], 
          char *buffer, size_t buflen) 
{ 
    int min, max; 
    matminmax(ax, ay, a, &min, &max); 
    int len1 = snprintf(0, 0, "%d", min); 
    int len2 = snprintf(0, 0, "%d", max); 
    if (len2 > len1) 
     len1 = len2; 
    snprintf(buffer, buflen, "%s%d%s", pfx, len1, sfx); 
} 

static void matprt(size_t ax, size_t ay, int a[ax][ay], const char *tag) 
{ 
    size_t i, j; 
    char format[32]; 

    set_printformat("%s%", "d", ax, ay, a, format, sizeof(format)); 
    printf("%s:\n", tag); 
    for (i = 0; i < ax; i++) 
    { 
     const char *pad = " "; 
     for (j = 0; j < ay; j++) 
     { 
      printf(format, pad, a[i][j]); 
      pad = ", "; 
     } 
     putchar('\n'); 
    } 
} 

int main(void) 
{ 
    int a[5][5] = 
    { 
     { 1, 2, 3, 4, 6 }, 
     { 6, 1, 5, 3, 8 }, 
     { 2, 6, 4, 9, 9 }, 
     { 1, 3, 8, 3, 4 }, 
     { 5, 7, 8, 2, 5 }, 
    }; 
    int b[5][5] = 
    { 
     { 3, 5, 0, 8, 7 }, 
     { 2, 2, 4, 8, 3 }, 
     { 0, 2, 5, 1, 2 }, 
     { 1, 4, 0, 5, 1 }, 
     { 3, 4, 8, 2, 3 }, 
    }; 
    int c[5][5]; 

    matprt(5, 5, a, "Matrix A"); 
    matprt(5, 5, b, "Matrix B"); 
    matmul(5, 5, a, 5, 5, b, 5, 5, c); 
    matprt(5, 5, c, "Matrix C"); 
    return(0); 
} 

如果有人照顧解釋如何表明這兩個輸入矩陣matmul()是恆定的,第三不是,我會很感激。

請注意,我忽略了從matmul()返回錯誤的可能性。