【发布时间】: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