0

以下は、2 つの行列の乗算のための私の C++ コードです。最初の入力は次元です。つまり、行列 1 の行と列、および行列 2 の行と列です。次に、両方の行列のすべての要素を入力する必要があります。それが完了したら、2 つの行列を乗算し、結果の行列を表示する必要があります。しかし、1 つの理由で、すべての要素を入力した後、動かなくなってしまいます。私が間違っていることを理解している人はいますか?

#include <iostream>
#include "Matrix_functions.hpp"

using namespace std;    

int read_matrix(int** matrix, int rows, int cols)
{
    for(int i = 0; i < rows; i++)
    {
        matrix[i] = new int[cols];
        for(int j = 0; j < cols; j++)
        {
            cin >> matrix[i][j];
        }
    }

    return **matrix;
} 

int print_matrix(int** result, int rows, int cols)
{
    for(int i = 0; i < rows; i++)
    {
        for(int j = 0; j < cols; j++)
        {
            cout << result[i][j];
        }
    }

    cout << endl;

    return **result;
}

int multiply_matrix(int** matrix, int rows, int cols, int** matrix1, int rows1, int    cols1, int** result)
{
    for(int i = 0; i < rows; i++)
    {
        for(int j = 0; j < cols1; j++)
        {
            result[i][j] = 0;

            for(int k = 0; k < cols; k++)
            {
                result[i][j] = result[i][j] + (matrix[i][k] * matrix1[k][j]);
            }
        }
    }

    return **result;
 }

int main ()
{
    //matrices and dimensions
    int rows1, cols1, rows2, cols2;
    int **matrix1, **matrix2, **result = 0;

    cout << "Enter matrix dimensions" << endl;
    cin >> rows1 >> cols1 >> rows2 >> cols2;

    cout << "Enter a matrix" << endl;

    matrix1 = new int*[rows1];

    // Read values from the command line into a matrix
    read_matrix(matrix1, rows1, cols1);

    cout << "Enter a matrix" << endl;

     matrix2 = new int*[rows2];

    read_matrix(matrix2, rows2, cols2);

    // Multiply matrix1 one and matrix2, and put the result in matrix result
    multiply_matrix(matrix1, rows1, cols1, matrix2, rows2, cols2, result);

    print_matrix(result, rows1, cols2);

    //TODO: free memory holding the matrices

    return 0;
}

また、現在、私の行列は、行列 (1 2 とその下の 3 4) ではなく、1 次元の水平ベクトル (1 2 3 4) として出力されます。誰でもこれを解決する方法を説明できますか?

4

2 に答える 2

0
multiply_matrix(matrix1, rows1, cols1, matrix2, rows2, cols2, result); 
`new` for result? Forgot?

このようなもの:

result = new int*[rows1];
for(int i = 0; i < rows1; i++)
{
   result[i] = new int[cols2];
}
multiply_matrix(matrix1, rows1, cols1, matrix2, rows2, cols2, result); 

resultマトリックスにメモリが割り当てられていません。
したがって、あなたは未定義の動作の犠牲者です。

マトリックス形式での印刷に関しては、改行を印刷する必要があります。

読み取り関数と乗算関数から要素を返す必要はありません。

また、2 つの行列の乗算、つまり乗算のcols1 == rows2前に有効性を確認してください。

于 2013-09-15T16:19:43.543 に答える