我试图为矩阵重载* =运算符这是我对2运算符的*运算符的函数
template <class T>
Matrix<T> Matrix<T>::operator*(const Matrix& other) const
{
assert(cols == other.rows) ;
Matrix<T> temp(rows, other.cols) ;
for(unsigned i = 0 ; i < rows ; i++)
{
for(unsigned j = 0 ; j < other.cols ; j++)
{
temp.matrix[i][j] = 0 ;
for(unsigned k= 0 ; k < other.rows ; k++)
{
temp.matrix[i][j] = temp.matrix[i][j] + (matrix[i][k]*other.matrix[k][j]) ;
}
}
}
return temp ;
}
这是我的* =运算符实现
template <class T>
Matrix<T> Matrix<T>::operator*=(const Matrix& other) const
{
assert(cols == other.rows) ;
for(unsigned i = 0 ; i < rows ; i++)
{
for(unsigned j = 0 ; j < other.cols ; j++)
{
matrix[i][j] = 0 ;
for(unsigned k= 0 ; k < other.rows ; k++)
{
matrix[i][j] = matrix[i][j] + (matrix[i][k]*other.matrix[k][j]) ;
}
}
}
return *this ;
}
我无法弄清楚我的* =实现中语义错误的位置,因为它编译并运行但输出远高于预期
答案 0 :(得分:2)
问题在于,在仍然评估产品时,您无法将产品的结果分配给其中一个术语,因为这会破坏您仍然需要计算其他元素的原始值。
由于您有一个有效的二进制文件*
,实现*=
的简单方法是将其设为*this = *this * other
。
可以有快捷方式,但要求矩阵具有特定的结构(对角线,三角形相似)。在一般情况下,这是更简单和更安全的方式。
当然,我认为你的矩阵至少是可复制的和可分配的。如果即使也是可移动的,你也可以获得性能。
答案 1 :(得分:1)
在尝试计算产品时,您正在覆盖运营商的LHS。
选择矩阵:
1 0
0 1
和
2 0
0 2
对于i = 0
和j = 0
,您将结束制作第一个矩阵;
0 0
0 1
在开始乘法之前。你知道在那之后你不会得到正确的答案。
我不知道是否有一种技术可用于将两个矩阵相乘并将结果保存在LHS(或RHS)中。