【问题标题】:Overload matrix operator重载矩阵运算符
【发布时间】:2015-07-29 10:25:01
【问题描述】:

我正在使用 Strassen 算法进行矩阵乘法。我试图重载 ' * ' 运算符但没有成功。我在 C++ 方面的经验很少,我不知道如何解决它。

我在运行时没有出错,但 Matrix 参数 m 有磨损值(例如 8215421532 而不是 4),因此结果为 false。当我以更经典的方式(没有运算符)尝试 strassen 方法时,它工作得很好。

矩阵.h

class Matrix
{
public:

    int size;
    int** mat;

    Matrix(int n, int** values);
    Matrix(int n, int min, int max);
    virtual ~Matrix();

    void print();

    Matrix multiply(Matrix m);
    Matrix& operator=(const Matrix&);
    Matrix operator*(const Matrix&) const;
};

矩阵.cpp

Matrix Matrix::operator*(const Matrix& m) const {

    if (m.size != size){
        printf("La matrice n'a pas la bonne taille !\n");
        return Matrix(0,NULL);
    }

    int **res = new int*[size];
    for (int i = 0; i < size; i++){
        res[i] = new int[size];
    }

    // Breakpoint here: variable m seems completely wrong
    strassen(mat, m.mat, res, size);
    return Matrix(size, res);
}

Matrix& Matrix::operator=(const Matrix& m){
    for (int i = 0; i < m.size; i++)
    for (int j = 0; j < m.size; j++)
        mat[i][j] = m.mat[i][j];
    return *this;
}

main.cpp

Matrix m1 = Matrix(4, 0, 9);
Matrix m2 = Matrix(4, 0, 9);

printf("Matrice 1 :\n");
m1.print();
printf("Matrice 2 :\n");
m2.print();

printf("Multiplication Strassen :\n");
Matrix m3 = m1 * m2;
m3.print();

顺便说一句,如果您在“=”运算符中发现错误,请随时告诉我。感谢您的帮助,在过去的 2 个小时里一直卡在这个问题上......

编辑: 矩阵构造函数代码(我不明白为什么它在这里相关,但我相信你)

Matrix::Matrix(int n, int** values)
{
    size = n;

    mat = new int*[n];
    for (int i = 0; i < n; i++){
        mat[i] = new int[n];
        for (int j = 0; j < n; j++)
            mat[i][j] = values[i][j];
    }
}

Matrix::Matrix(int n, int min, int max)
{
    size = n;

    mat = new int*[n];
    for (int i = 0; i < n; i++){
        mat[i] = new int[n];
        for (int j = 0; j < n; j++)
            mat[i][j] = rand() % (max - min + 1) + min;
    }
}

EDIT2:通过添加复制构造函数(三规则)解决 --> 感谢 Igor Tandetnik(在 cmets 中)

Matrix::Matrix(const Matrix& m){
    size = m.size;

    mat = new int*[m.size];
    for (int i = 0; i < m.size; i++){
        mat[i] = new int[m.size];
        for (int j = 0; j < m.size; j++)
            mat[i][j] = m.mat[i][j];
    }
}

【问题讨论】:

  • 赋值运算符不能防止自赋值,你可能想解决这个问题。此外,您能否发布 Matrix 构造函数的代码,因为乘法运算符乍一看似乎很合理,因此可能存在错误。
  • 这里是矩阵构造函数的代码。感谢您的帮助!
  • Rule of three:如果您的类需要用户定义的复制构造函数、复制赋值运算符或析构函数中的任何一个,则很可能需要全部三个。您正在左右创建 Matrix 的副本 - 但没有复制构造函数。所以你使用的是编译器生成的,它只是复制mat 指针。您最终会得到多个 Matrix 实例,它们都指向相同的数据;然后其中一个实例死亡并销毁数据,而其他实例则持有悬空指针。
  • @IgorTandetnik 你应该发布一个答案
  • 确实...我读过它,但认为它与这里无关。三法则是解决方案,我正在寻找其他方法......

标签: c++ matrix operator-overloading


【解决方案1】:

通过添加复制构造函数(三规则)解决 --> 感谢 Igor Tandetnik(在 cmets 中)

Matrix::Matrix(const Matrix& m){
    size = m.size;

    mat = new int*[m.size];
    for (int i = 0; i < m.size; i++){
        mat[i] = new int[m.size];
        for (int j = 0; j < m.size; j++)
            mat[i][j] = m.mat[i][j];
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多