我正在声明一个二维向量,并且想在Matrix类中为其重载乘法运算符,但是我不知道如何用set函数正确填充元素
class Matrix{
public:
Matrix();
Matrix(int,int);
Matrix(vector<vector<double>>identity);
void set(int , int , int);
int get(int , int);
Matrix operator+(const Matrix &);
Matrix operator*(const Matrix &);
Matrix operator-(const Matrix &);
Matrix operator=(const Matrix &);
~Matrix();
private:
int row,column;
std::vector<vector<double>>mat;
};
void Matrix::set(int r,int c ,int e){
mat[r][c]=e;
}
//overloading * operator
Matrix Matrix::operator*(const Matrix &b)
{
int result=0;
for(int i=0 ; i< this->mat.size() ; i++){
for(int j=0 ; j< this->mat[i].size ; j++){
for(int k=0 ; k< b.mat[i].size() ; k++){
result[k]+=(this->mat[i][j]*b.mat[j][k]);
result.set(i,j,result[k]);
}
}
}
return result;
}
答案 0 :(得分:1)
您要的内容无法使用operator * ()
完成。原因是因为成员函数set()
将使类发生变化,即更改对象的成员数组的元素中的值。 operator * ()
返回Matrix
对象的副本。它不会修改现有对象。
可以使用set()
来使用operator *= ()
,这是用来修改当前对象的。
这里是如何使用它的示例。 注意,下面的示例写得很快。只是为了说明不同的运算符重载情况。
#include <iostream>
#include <vector>
#include <algorithm>
template<typename T>
using Array2D = std::vector<std::vector<T> >;
struct Matrix
{
Array2D<double> m;
Matrix(std::size_t rows_, std::size_t columns_)
{
m.resize(rows_);
for (auto &&r : m)
{
r.resize(columns_);
std::fill(r.begin(), r.end(),0.0);
}
}
Matrix(Array2D<double> &&m_) : m(std::move(m_))
{;}
Matrix(const Matrix &mat_) : m(mat_.m)
{;}
void print()
{
for (const auto &r : m)
{
for (const auto &c : r)
std::cout<< c <<" ";
std::cout<<std::endl;
}
std::cout<<std::endl;
}
void set(std::size_t row_, std::size_t column_, double value_)
{
m[row_][column_] += value_;
}
Matrix operator * (const Matrix &mat_)
{
auto rows = m.size();
auto cols = m[0].size();
auto cols2 = mat_.m[0].size();
Matrix tmp(rows,cols2);
for(std::size_t r=0; r<rows; ++r)
{
for(std::size_t c=0; c<cols2; ++c)
{
for(std::size_t k=0; k<cols; ++k)
{
tmp.m[r][c] += this->m[r][k] * mat_.m[k][c];
}
}
}
return tmp;
}
Matrix& operator *= (const Matrix &mat_)
{
auto rows = m.size();
auto cols = m[0].size();
auto cols2 = mat_.m[0].size();
Matrix tmp(*this);
for(std::size_t r=0; r<rows; ++r)
{
for(std::size_t c=0; c<cols2; ++c)
{
this->m[r][c] = 0.0;
for(std::size_t k=0; k<cols; ++k)
{
set(r,c, tmp.m[r][k] * mat_.m[k][c]);
}
}
}
return *this;
}
};
int main()
{
Matrix m1 = {{
{1,2,0},
{0,1,0},
{1,2,1}
}};
Matrix m2 = {{
{0,1,2},
{1,2,0},
{2,0,0}
}};
Matrix m3 = m1*m2;
m3.print();
m3 *= m1;
m3.print();
}
结果是:
2 5 2
1 2 0
4 5 2
4 13 2
1 4 0
6 17 2