0

こんにちは、誰かが私が間違っていることを理解するのを手伝ってくれますか。行列の乗算を実行する関数を作成します。すべての値が表示されません。私はここで本当に混乱しています。ありがとうございます (C++ は初めてです)

    int MultiplyTwoMatrices(int **MatrixA, int rowA, int ColumnA, int **MatrixB, int rowB,    int columnB);
int **Matrixmultiply;       //I have allocated and freed it's memory
int rowA=4;
int rowB=4;
int columnA=4;
int columnB=4;

int main()
{
for ( x = 0; x < rowA; x++)
{
    for (y = 0; y < columnB; y++)
    {
    Matrixmultiply[x][y] = MultiplyTwoMatrices(MatrixA,rowA,columnA,MatrixB,rowB,columnB);
        cout<<Matrixmultiply[x][y] <<"\t";

    }
    cout<<"\n";
}

int MultiplyTwoMatrices(int **MatrixA, int rowA, int ColumnA, int **MatrixB, int rowB,    int columnB)
{

int **temp = NULL;
int sum = 0;
double **Multiple = NULL;
int i=0, j=0;

temp = (int**)malloc(columnB*(sizeof(int*)));
for (int p=0; p<columnB; p++)
    {
        temp[p] = (int*)malloc(rowB*(sizeof(int))); 

    }

Multiple = (double**)malloc(rowA*(sizeof(double*)));
for (int p=0; p<rowA; p++)
    {
        Multiple[p] = (double*)malloc(columnB*(sizeof(double))); 

    }

for (int p =0; p<columnB; p++)
    {
        for (int q = 0; q<rowB; q++)
        {
            temp[p][q] = MatrixB[q][p];
        }

    }
for (i =0; i<rowA; i++)
    {
        for (j = 0; j<columnB; j++)
        {
            for (int r = 0; r<rowB; r++)
            {
            sum = sum + (MatrixA[i][r]  * temp[j][r]);
            }

            Multiple[i][j] = sum;
            return Multiple[i][j];
            //cout<<Multiple[i][j]<<"\t";
            sum=0;
        }
            //cout<<"\n";

    }


for (int p =0; p<columnB; p++)
    free (temp[p]);
    free(temp);
for (int p =0; p<rowA; p++)
    free (Multiple[p]);
    free(Multiple);
}
4

1 に答える 1

0

わかりました、まず第一に、コードには多くのクリーンアップが必要です。関数を自己完結型にしておくことをお勧めします。そのため、関数に 2 つの行列引数のみを渡し、すべての反復を関数自体で行います。これに対する簡単な議論は効率です。そうでなければ、コードは n*m 関数呼び出しを行う必要があり、良くありません。そう:

int MultiplyTwoMatrices(int **MatrixA, int **MatrixB){}

さらに良いことに、C ではなく C++ を使用しているため、オブジェクトを使用してください。int ** をマトリックス クラス内にカプセル化します。これにより、作業がずっと楽になります。ポインタではなく、オブジェクト参照を渡すだけで済みます。

C++ を最大限に活用できるように、私が推奨する本を読むことを強くお勧めします。

とにかく問題は、 for ループ内に戻っていることです。関数を返すと停止するため、最後の for ループを反復していません。

于 2013-02-23T20:59:51.300 に答える