运算符*=来自两个实例(矩阵),结果不好
Operator*= from two instances (Matrix) gives bad results
我有一个类Matrix,我正在尝试实现方法运算符*=,我用它来生成两个实例(矩阵)的乘积:m1*=m2。
我尝试了两种方法,都有friend和两个参数,没有friend和一个参数,但在这两种情况下,结果都很糟糕。只有一个参数,这个用法给了我类似于右边的结果(并不总是)。
尝试使用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),或者第一列是右数字,第二列不是
您报告错误的原因似乎是乘法算法本身。基本上,你的乘法代码如下:
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()
调用),因此当您为任何i < j
调用this->Get(i,k)
时,您获得的不是i
行和k
列的第一个矩阵的原始值,而是已经由this->Set()
调用修改的值。这显然导致了错误的结果。
为了解决此问题,您必须确保在计算中使用原始矩阵值,例如,通过复制原始矩阵或(更优化的)原始矩阵的当前修改行。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 从C++实例化QML
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 使用std::vector的OpenCL矩阵乘法
- 如何在c++中为模板函数实例创建快捷方式
- 使用C++中的模板和运算符重载执行矩阵运算
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- Eigen如何在容器循环中干净地附加矩阵
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 当在带有Eigen的C++中使用GDB时,我如何才能看到更多的大矩阵
- 具有N列和N行的矩阵,列必须具有N-1、N-2等值
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- GCC本机矩阵运算库
- 矩阵向量乘法(cublasDgemv)返回零
- 运算符*=来自两个实例(矩阵),结果不好
- 如何创建知道它的实例在另一个类的矩阵中的方法
- 我可以声明一个未知类型的特征矩阵吗,或者至少声明一个泛型矩阵并稍后实例化吗