来自两个实例的运算符* =(矩阵)给出了不好的结果

时间:2019-01-12 20:46:06

标签: c++ arrays matrix

我有一个Matrix类,正在尝试实现operator * =方法,该方法用于生成两个实例(矩阵)的乘积:m1 * = m2。

我尝试了同时使用friend和两个参数,而没有friend和1参数的两种方法,但是在两种情况下,结果都是不好的。仅使用一个参数,这种用法使我得到的结果类似于右图(并非总是如此)。

尝试使用friend和2个参数,不使用friend和1个参数。尝试直接返回第一个矩阵m1,还创建了一个临时矩阵m3

我的私人成员:

int N, M;      
T** data;
bool Init(const int N_, const int M_);
void Clear();

(我正在使用init初始化矩阵/二维数组):

bool Matrix::Init(const int N_, const int M_) {
  this->Clear(); //dealloco comunque prima di inizializzarla
  N = N_;
  M = M_;
  if (N <= 0 || M <= 0) {
      cerr << "Non posso generare una matrixe: " << N <<"x"<< M << endl;
      return false;
  }
  else if (N > 0 && M > 0) {
      data = new T*[N];
      for (int i = 0; i < N; i++) {
        data[i] = new T[M];
      }
  }
return true;

}

我的运算符* = Mathod(没有朋友,1个参数):

Matrix& Matrix::operator*=(const Matrix& m2) {

    float operation = 0;
    int N_ = (this->N < m2.N) ? this->N : m2.N;
    int M_ = (this->M < m2.M) ? this->M : m2.M;
    Matrix m3(N_, M_);

    if (this->N != m2.M || this->M != m2.N) {
        this->Set(0, 0, flag_stop);
    }
    else {

        for (int i = 0; i < this->N; ++i) {
            for (int j = 0; j < m2.M; ++j) {
                for (int k = 0; k < this->M; ++k) {
                    operation = operation + (this->Get(i,k) * m2.Get(k,j)) ;
                    //cout << " Cout m1 su "<< i<< ","<<k<<":"<< this->Get(i,k) << "\t " << " Cout m2: "<< m2.Get(k,j) << endl;
                    this->Set(i, j, operation);
                }

                //cout << operation << "\t";
                operation = 0;
            }
            operation = 0;
        }
    }
    return *this;
}

主要,当我尝试使用运算符* =:

Matrix m1(i1,j1);
Matrix m2(i2,j2);

//operator*=
    cout << endl;
    m1*=m2;
    int N_ = (m1.GetN() < m2.GetN()) ? m1.GetN() : m2.GetN();
    int M_ = (m1.GetM() < m2.GetM()) ? m1.GetM() : m2.GetM();

    for (int i = 0; i < N_; ++i) {
        for (int j = 0; j < M_; ++j) {
            cout << m1.Get(i,j) << "\t";
        }
        cout << endl;
    }

我整天都在尝试,但是结果不正确 我也尝试了m1 [2] [2]和m2 [2] [2],m1 [3] [2]和m2 [2] [3]等,但是没有。有人有类似的问题吗?

希望有两个矩阵的乘积,但是在大多数情况下,我有大数(预期为5,获得30),或者第一列为右数,而第二列没有。

1 个答案:

答案 0 :(得分:2)

您报告的错误原因似乎是乘法算法本身。基本上,您的乘法代码如下:

GROUP BY

您的算法仅在计算过程中(调用for (int i = 0; i < this->N; ++i) { for (int j = 0; j < m2.M; ++j) { for (int k = 0; k < this->M; ++k) { operation = operation + (this->Get(i,k) * m2.Get(k,j)) ; this->Set(i, j, operation); } operation = 0; } } 修改了原始矩阵,因此当您为任何this->Set()调用this->Get(i,k)时,您不会获得第一个矩阵的原始值位于第i < j行和第i列,但该值已被k调用修改。这显然会导致错误的结果。

为了解决此问题,您必须确保使用原始矩阵值进行计算,例如,通过复制原始矩阵或(最好是复制)原始矩阵的当前行。