5

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
4

9 に答える 9

9

これが私が使用する行列乗算コードです:

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];
        }
    }
}

重要なのは、回答マトリックスをゼロに設定することです(残りはコードなしで言っています)。

于 2012-04-15T13:39:36.340 に答える
5

問題は、その行に

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

あなたはmatCに何かを追加していますが、それを作成するときに初期化しないので、ゴミがあります。

あなたは次のようなことをするべきです:

int matC[2][2] = {0}すべてのマトリックスを0で初期化します

于 2012-04-15T13:45:42.123 に答える
4

matCには、最初はいくつかのガベージ値が含まれています。martixをすべてゼロに初期化します。これはあなたの問題を解決するかもしれません

于 2012-04-15T13:36:09.567 に答える
2

次の方法で、ユーザーが任意のサイズの行列乗算を行うことができます。

#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...!!!");
}
于 2017-01-10T15:41:51.473 に答える
1

サイズと依存関係が問題にならない場合は、GNUScientificLibraryを使用することをお勧めします。機能については、こちらをご覧ください:http: //en.wikipedia.org/wiki/GNU_Scientific_Library

数学計算用に最適化されたルーチンが含まれており、一部のコンパイラー最適化では非常に高速です。

すでに3D開発のマトリックス操作に使用されています。

于 2012-04-15T13:48:16.897 に答える
1

C最初にの要素をゼロに初期化する必要があります。

于 2012-04-15T13:35:08.093 に答える
0

matCすべてゼロに初期化する必要があります。

于 2012-04-15T13:38:21.590 に答える