簡體   English   中英

C 中的矩陣乘法

[英]Matrix Multiplication In C

我正在嘗試用 C 解決矩陣乘法問題。問題 (2x2) 中給出的矩陣大小我編寫了這段代碼,但它沒有像我預期的那樣打印結果。 我想我遺漏了關於 C 規則的一點。

我在這段代碼中的錯誤是什么?

#include <stdio.h>
int main() {
    int matA[2][2]={0,1,2,3};
    int matB[2][2]={0,1,2,3};
    int matC[2][2];
    int i, j, k;
    for (i = 0; i < 2; i++) {
        for(j = 0; j < 2; j++) {
            for(k = 0; k < 2; k++) {
                matC[i][j] += matA[i][k] * matB[k][j];
            }
            printf("%d\n",matC[i][j]);
        } 
    }
}

打印結果:

2 
3 
4195350
11

這是我使用的矩陣乘法代碼:

for(i=0;i<M;i++){
    for(j=0;j<K;j++){
        matC[i][j]=0;
        for(k=0;k<N;k++){
            matC[i][j]+=matA[i][k]*matB[k][j];
        }
    }
}

重要的是將答案矩陣設置為零(正如其他人在沒有代碼的情況下所說的那樣)。

問題是在行中

matC[i][j] += matA[i][k] * matB[k][j];

您正在向 matC 添加東西,但是當您創建它時,您沒有初始化它,因此它有垃圾。

你應該做這樣的事情:

int matC[2][2] = {0}它將用 0 初始化所有矩陣

matC 最初包含一些垃圾值。 將 martix 初始化為全零。 這可能會解決您的問題

您可以通過以下方式由用戶進行任何給定大小的矩陣乘法:

#include<stdio.h>
void main()
{
    int r1, c1, r2, c2;

    printf("Enter number of rows and columns for matrix A : ");
    scanf("%d %d",&r1,&c1);

    printf("Enter number of rows and columns for matrix B : ");
    scanf("%d %d",&r2,&c2);

    int a[r1][c1], b[r2][c2], ab[r1][c2], ba[r2][c1],i,j,k,temp;

    if(c1==r2 && r1==c2)
    {
        printf("\nEnter element in matrix A : ");
        for(i=0;i<r1;i++)
        {
            for(j=0;j<c1;j++)
            {
                printf("\n Enter element : ");
                scanf("%d",&a[i][j]);
            }
        }
        printf("\nEnter element in B : ");
        for(i=0;i<r2;i++)
        {
            for(j=0;j<c2;j++)
            {
                printf("\nEnter element : ");
                scanf("%d",&b[i][j]);
            }
        }
        for(i=0;i<r1;i++)
        {
            for(j=0;j<c2;j++)
            {
                temp=0;
                for(k=0;k<r2;k++)
                {
                    temp+=a[i][k]*b[j][k];
                }
                ab[i][j]=temp;
            }
        }
        for(i=0;i<r2;i++)
        {
            for(j=0;j<c1;j++)
            {
                temp=0;
                for(k=0;k<r1;k++)
                {
                    temp+=b[i][k]*a[k][j];
                }
                ba[i][j]=temp;
            }
        }
        printf("\nMatrix A : ");
        for(i=0;i<r1;i++)
        {
            printf("\n\t");
            for(j=0;j<c1;j++)
            {
                printf("%d",a[i][j]);
            }
            printf("\n");
        }
        printf("\nMatrix B : ");
        for(i=0;i<r2;i++)
        {
            printf("\n\t");
            for(j=0;j<c2;j++)
            {
                printf("%d",b[i][j]);
            }
        }
        printf("\nMatrix multiplication of A*B : ");
        for(i=0;i<r1;i++)
        {
            printf("\n\t");
            for(j=0;j<c2;j++)
            {
                printf("\t%d",ab[i][j]);
            }
            printf("\n");
        }
        printf("\nMatrix multiplication of B*A : ");
        for(i=0;i<r2;i++)
        {
            printf("\n\t");
            for(j=0;j<c1;j++)
            {
                printf("\t%d",ba[i][j]);
            }
            printf("\n");
        }
    }
    else
        printf("\nMatrix Multiplication is not possible...!!!");
}

您必須首先將C元素初始化為零。

如果大小和依賴關系無關緊要,我建議使用 GNU 科學庫。 有關功能,請參見此處: http : //en.wikipedia.org/wiki/GNU_Scientific_Library

它包含用於數學計算的優化例程,並且通過一些編譯器優化非常快。

已經成功地將其用於 3D 開發中的矩陣運算。

您應該將matC初始化為全零。

您可能希望為結果矩陣動態分配內存。 如果是這樣,請使用calloc()分配和清除元素。 printMatrix()來打印結果,但這里沒有定義。

/* matrix1: [rows1 x cols1];  matrix2: [rows2 x cols2]; product is
matrix3: [rows1 x cols2] if (cols1 == rows2) is true.  calloc to 
allocate / clear memory for matrix3.  Algorithm is O(n^3) */

float ** matrix3;
if (cols1 == rows2) {  // product matrix can be calculated
    // calloc product matrix3
    matrix3 = (float **)calloc(rows1, sizeof(float *));
    for (int i = 0; i < rows1; i++)
        matrix3[i] = (float *)calloc(cols2, sizeof(float));

    int i, j, k;
    float tmp;
    for (i = 0; i < rows1; i++) {
        for (j = 0; j < cols2; j++) {
            tmp = 0.0;
            for (k = 0; k < rows2; k++)
                tmp += matrix1[i][k] * matrix2[k][j];
            matrix3[i][j] = tmp;
        }
    }
    printMatrix(matrix3, rows1, cols2, 3);
    free(matrix3);
} else {   // cols1 != rows2
    puts("dimensional mismatch; can't multiply matrices");
}
//
//  main.c
//  Matrix Multiplicatiion.
//
//  Created by Devansh on 15/07/21.
// THIS WORKS FOR ANY MATRIX multiplication 
//

#include <stdio.h>

int main()
{
    int arow,acolumn,brow, bcolumn,i,j;
    int MAX=100;
    int a[MAX][MAX];
    int b[MAX][MAX];
    printf("enter rows of matrix a: ");
    scanf("%d", &arow);
    printf("enter columns of matrix a: ");
    scanf("%d", &acolumn);
    printf("enter rows of matrix b: ");
    scanf("%d", &brow);
    printf("enter columns of matrix b: ");
    scanf("%d", &bcolumn);
    if(brow != acolumn){
        printf("sorry we cannot multiply matrix a and b");
    } else {
        printf("enter the elements of matrix a:\n");
        for (i=0;i<arow;i++) {
            for(j=0;j<acolumn;j++) {
                scanf("%d", &a[i][j]);
            }
        }
        
        printf("enter the elements of matrix b:\n");
        for (i=0;i<brow;i++) {
            for (j=0;j<bcolumn;j++) {
                scanf("%d", &b[i][j]);
            }
        }
        int product[MAX][MAX];
        int sum=0;
        for (i=0;i<arow;i++) {
            for(j=0;j<bcolumn;j++){
                for(int k=0;k<brow;k++){
                    sum += a[i][k] * b[k][j];
                }
                product[i][j]= sum;
            }
        }
        for (i=0;i<arow;i++) {
            for (j=0;j<bcolumn;j++) {
                printf("%d   ", product[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}

您可以使用此代碼找到任何維度的 2 矩陣的乘法(例如 2x3 和 3x2 大小矩陣的乘法)。

 #include <stdio.h>
     int main()
    {
    int p, q, r, s;
    printf("enter the dimension of first matrix\n");
    scanf("%dx%d", &p, &q);
    printf("enter the dimension of second matrix\n");
    scanf("%dx%d", &r, &s);
    if (q != r)
    {
        printf("multiplication is not possible\n");
    }
    else
    {
        int a[p][q], b[r][s], c[p][s];
        printf("enter the first matrix\n");
        for (int i = 0; i < p; i++)
        {
            for (int j = 0; j < q; j++)
            {
                scanf("%d", &a[i][j]);
            }
        }
        printf("enter the second matrix\n");
        for (int i = 0; i < r; i++)
        {
            for (int j = 0; j < s; j++)
            {
                scanf("%d", &b[i][j]);
            }
        }
        for (int i = 0; i < p; i++)
        {
            for (int j = 0; j < s; j++)
            {
                int sum = 0;
                for (int k = 0; k < r; k++)
                {
                    sum = sum + (a[i][k] * b[k][j]);
                }
                c[i][j] = sum;
            }
        }
        printf("resultant matrix is....\n");
        for (int i = 0; i < p; i++)
        {
            for (int j = 0; j < s; j++)
            {
                printf("%d\t", c[i][j]);
            }
            printf("\n");
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM