【问题描述】
矩阵是线性代数中的重要概念,应用领域非常广泛,在C/C++中,通常将矩阵定义为一个二维数组。
本问题中,将输入两个矩阵 A 和 B,实现对矩阵的数乘、矩阵加法、矩阵乘法以及行列式的计算。
如果对矩阵的算法不了解,请查阅相关资料。
【输入形式】
输入的第一行为两个正整数 M 和 N,分别表示矩阵 A 的行数和列数;
接下来的 M 行,每行 N 个用空格分隔的整数,表示矩阵 A 的元素值;
接下来的一行,为一个整数 x, 用于对矩阵 A 进行数乘;
接下来的一行为两个正整数 K 和 L, 分别表示矩阵 B 的行数和列数;
接下来的 K 行,每行为 L 个用空格分隔的整数,表示矩阵 B 的元素值。
【输出形式】
(既然都已经找到了这里后面是啥就不重要了凸(`0´)凸)
废活少说,本文特点是删除m行n列做法市面上最精简,祝各位都能跟上发布作业的速度,取个关加举报是我销号的动力,而且你可以在HNU2020本科信息群里面搜出一堆姓林的,HNU信息院2020的某林会和你一起努力的!!!(滑稽)
#include <iostream>
#include <cstdlib>
using namespace std;
class matrix
{
private:
int rows, cols;
int **p;
public:
matrix();
matrix(int &M, int &N);
matrix(matrix &A, int m, int n);
~matrix();
matrix multi(int x); // 数乘
int det(); // 计算行列式
void out(); //输出矩阵
void input();
matrix operator+(matrix &another); //重载加法运算实现矩阵相加
matrix operator*(matrix &another); //重载乘法运算实现矩阵相乘
};
matrix::matrix(int &M, int &N)
{
rows = M, cols = N;
p = new int *[rows];
for (int i = 0; i < M; i++)
{
p[i] = new int[cols];
}
}
matrix::matrix(matrix &A, int m, int n) //从矩阵A中删除第m行第n列后得到新的矩阵
{
rows = A.rows - 1;
cols = A.cols - 1;
p = new int *[rows];
for (int i = 0; i < rows; i++)
{
p[i] = new int[cols];
}
int i, j, a, b;
for (i = a = 0; i < A.rows; i++)
{
if (i == m)
continue;
for (j = b = 0; j < A.cols; j++)
{
if (j == n)
continue;
p[a][b++] = A.p[i][j];
}
a++;
}
}
matrix::~matrix()
{
for (int i = 0; i < rows; i++)
delete[] p[i];
delete[] p;
}
matrix matrix::multi(int x) // 数乘
{
matrix tmp(rows, cols);
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
tmp.p[i][j] = p[i][j] * x;
}
}
return tmp;
}
void matrix::out() //输出矩阵
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
cout << p[i][j] << " ";
}
cout << endl;
}
}
void matrix::input()
{
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
cin >> p[i][j];
}
matrix matrix::operator+(matrix &another) //重载加法运算实现矩阵相加
{
matrix tmp(rows, cols);
/* 矩阵对应位置元素相加 */
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
tmp.p[i][j] = p[i][j] + another.p[i][j];
}
}
return tmp;
}
matrix matrix::operator*(matrix &another) //重载乘法运算实现矩阵相乘
{
matrix tmp(rows, another.cols);
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < another.cols; j++)
{
tmp.p[i][j] = 0;
for (int m = 0; m < cols; m++)
{
tmp.p[i][j] += p[i][m] * another.p[m][j];
}
}
}
return tmp;
}
int matrix::det()
{
if (rows == 1)
return p[0][0];
else
{
int result = 0, flag;
for (int i = 0; i < cols; i++)
{
flag = (i % 2) ? -1 : 1;
matrix tmp(*this, 0, i);
result = result + flag * p[0][i] * tmp.det(); // 使用代数余子式求行列式的值, 递归
}
return result;
}
}
int main()
{
int M, N;// A矩阵的行和列
cin >> M >> N;
matrix mA(M, N); //生成A矩阵
mA.input();// 输入矩阵值
// 输入数乘值
int x;
cin >> x;
matrix mm1 = mA.multi(x);
mm1.out();
//B矩阵的行和列
int K, L;
cin >> K >> L;
matrix mB(K, L); //生成B矩阵
mB.input();
/* 求矩阵A和矩阵B的和 */
if (M == K && N == L)
{
matrix mm2 = mA + mB;
mm2.out();
}
/* 求矩阵A和矩阵B的乘积矩阵 */
if (N == K)
{
matrix mm3 = mA * mB;
mm3.out();
}
/* 矩阵A的行列式的值 */
if (M == N)
cout << mA.det() << endl;
if (K == L)
cout << mB.det() << endl;
return 0;
}