首先是矩阵和一般运算最不一样的地方就是乘法,不多说先上代码。
Matrix operator*(Matrix src)
{
if (src.row == this->col)
{
int same = this->col;
Matrix out;
out.row = this->row;
out.col = src.col;
out.create();
for (int i = 0; i < this->row; i++)
for (int j = 0; j < this->col; j++)
{
for (int k = 0; k < same; k++)
out.data[i][j] += this->data[i][k] * src.data[k][j];
}
return out;
}
else
{
std::cout << "矩阵维度不一致" << std::endl;
}
}
代码的时间复杂度是O(n3),计算输出矩阵的每一个位置都需要一个O(n)的复杂度。
在其他地方查阅过一些资料,发现目前最优化的方法也不能达到O(n2),而且还伴随着一系列的使用环境限制。
所以,在这里仅仅使用了传统最基础的办法实现,对于任何矩阵都成立,没有限制。
在这里我进行了对于运算符的重载,该函数仅仅实现了乘法,但是没有为所有if设置返回值,存在一定的问题。
Matrix operator*(Matrix src)
在这里*运算符只有一个成员,其实它还是二元运算符,其中还有一个this指针被省略了
如A * B,其中A就是this,B作为重载运算符的一元输入,对于B * A,则反之。
再就是减法,需要注意的是,但是在VS中如operator-(class a,class b)
这样的表达会报错,函数的参数过多。
所以想要写成二元函数的形式,需要将函数声明为友元函数。
friend Matrix& operator-(Matrix src, Matrix in)
{
//Matrix out = Matrix::create(src);
if (src.col == in.col && src.row == in.row)
{
for (int i = 0; i < in.row; i++)
for (int j = 0; j < in.col; j++)
{
src.data[i][j] -= in.data[i][j];
}
return src;
}
else
{
std::cout << "矩阵维度不一致" << std::endl;
}
}
加法与其类似
好了,以上就是矩阵的基本运算的实现。下一次,我们来实现矩阵的一些进阶运算,包括行列式,求逆,转置等等。。。