矩阵的加减乘比较简单,运用简单的嵌套循环就行,而求逆就需要拆分功能
二话不说,上代码:
(创作不易,一键三连!!!)
#include <iostream>
#include <conio.h>
#include <iomanip>
#include<cstdlib>
#include <fstream>
using namespace std;
void su(int v,int s) {
double a[10][10] = { 0 }, b[10][10] = { 0 }, c[10][10] = { 0 }, p[10][10] = { 0 };//0数组
int ch;
cout << "输入第一个矩阵:" << endl;
for (int r = 0; r < v; r++) //对a b数组初始化
{
for (int c = 0; c < s; c++)
{
cin>>a[r][c];
}
}
cout << "输入第二个矩阵:" << endl;
for (int r = 0; r < v; r++)
{
for (int c = 0; c < s; c++)
{
cin>>b[r][c];
}
}
cout << "选择功能加 减 乘或者求解二元一次方程" << endl;
while (1)
{
if (_kbhit())
{
ch = _getch();
if (ch == 43) { //各元素相加
for (int i = 0; i < v; i++) {
for (int j = 0; j < s; j++) {
c[i][j] = a[i][j] + b[i][j];
cout << setw(9) << c[i][j];
}
cout << endl;
}
}
if (ch == 45) {
for (int i = 0; i < v; i++) {
for (int j = 0; j < s; j++) {
c[i][j] = a[i][j] - b[i][j];
cout << setw(10) << c[i][j];
}
cout << endl;
}
}
if (ch == 42) {
for (int i = 0; i < v; i++) {
for (int j = 0; j < s; j++) {
int sum = 0;
for (int k = 0; k < s; k++) {
sum +=a[i][k] * b[k][j]; //矩阵相乘,对应行列元素相乘,进行累和
}
cout << setw(9) << sum;
}
cout << endl;
}
}
if (ch == 27) {
int x1 = (a[0][2] * b[0][1] - b[0][2] * a[0][1]) / (a[0][0] * b[0][1] - b[0][0] * a[0][1]);
int x2 = (a[0][0] * b[0][2] - b[0][0] * a[0][2]) / (a[0][0] * b[0][1] - b[0][0] * a[0][1]);
cout << x1 << " " << x2;
}
}
}
}
double* MatT(int row, int col, double* Mat)//矩阵转化
{
double* result = new double[row * col]; //结果
for (int i = 0; i < row * col; i++)
{
int x = i + 1;//i从0开始 x从1开始
int rowMat = 1;
int colMat = 0;
while (1)
{
if (x - col > 0)
{
x = x - col;
rowMat++;
}
else
{
colMat = x;
break;
}
}
result[(colMat - 1) * row + rowMat - 1] = Mat[i];//转化为一维坐标i=(colMat-1)*row+rowMat-1
}
return result;
}
double det(int n, double* Mat) //求行列式
{
if (n == 1)
return Mat[0];
double* subMat = new double[(n - 1) * (n - 1)];
int mov = 0;
double sum = 0.0;
for (int i = 0; i < n; i++)
{
for (int k = 0; k < n - 1; k++)
{
mov = i > k ? 0 : 1;
for (int j = 0; j < n - 1; j++)
{
subMat[k * (n - 1) + j] = Mat[(k + mov) * n + j + 1];
}
}
int flag = (i % 2 == 0 ? 1 : -1);
sum += flag * Mat[i * n] * det(n - 1, subMat);
}
delete[]subMat;
return sum;
}
void ni() { //进行求逆
int n;
int i, j;
cout << "请输入矩阵的阶数" << endl;
cin >> n;
double* Mat = new double[n * n];
cout << "请输入这个矩阵" << endl;
for (i = 0; i <= n * n - 1; i++)
cin >> Mat[i];
double* subMat = new double[(n - 1) * (n - 1)];
double* adjointMat = new double[n * n];
double detMat;
double* inverseMat = new double[n * n];
detMat = det(n, Mat);
if (detMat == 0)
cout << "该矩阵不可逆!" << endl;
else
{
int adjointMat_index = 0;
for (int Mat_i = 1; Mat_i <= n; Mat_i++)
{
for (int Mat_j = 1; Mat_j <= n; Mat_j++)
{
int M_index = 0; //求mat i,j的余子式Mij
for (i = 0; i < n * n; i++)//第x个元素对应n阶矩阵的第row行第col列
{
int x = i + 1;
int row = 1;
int col = 0;
while (1)
{
if (x - n > 0)
{
x = x - n;
row++;
}
else
{
col = x;
break;
}
}
if (row != Mat_i && col != Mat_j)
{
subMat[M_index] = Mat[i];
M_index++;
}
}
adjointMat[adjointMat_index] = (adjointMat_index % 2 == 0 ? 1 : -1) * det(n - 1, subMat);
adjointMat_index++;
}
}
adjointMat = MatT(n, n, adjointMat);//求出伴随矩阵
int adMat_index = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
adMat_index++;
}
}
for (i = 0; i < n * n; i++)
inverseMat[i] = adjointMat[i] / detMat;
cout << "该矩阵的逆矩阵为" << endl;
int inverseMat_index = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
cout << inverseMat[inverseMat_index] << "\t";
inverseMat_index++;
}
cout << endl;
}
}
delete[]Mat;
}
int main() {
int ch;
int x,y;
cout << "选择功能:1.加减乘求解 2.求逆" << endl;
while (1)
{
if (_kbhit())
{
ch = _getch(); //获取键值,49代表1,进入加减乘功能
if (ch == 49) {
cout << "输入矩阵行列";
cin >> x>>y;
su(x,y);
}
if (ch == 50) { //50代表2,进入求逆
ni();
}
}
}
return 0;
}