IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 矩阵行列式数值计算 -> 正文阅读

[C++知识库]矩阵行列式数值计算

?小白第一次发帖,大一刚刚学了线代,于是乎想用刚学的C语言写一个计算行列式、矩阵乘法、矩阵求逆、转置的小程序,还有许多待优化的地方,希望大佬可以指点一二。

//行列式计算、矩阵转置、矩阵求积、矩阵求逆

#include <stdio.h>
#include <math.h>

#define Max 20 //行列式与矩阵最大阶数为20

void menu();//菜单
void put_matrix(int matrix[][Max], int *r, int *c);//输入矩阵
void put_det(int det[][Max], int *n);//输入行列式
void Matrix_Transpose(int matrix[][Max]);//矩阵转置
void Matrix_Multiply(int matrix1[][Max], int matrix2[][Max]);//矩阵求积
void Matrix_Inverse(int matrix[][Max]);//求矩阵的逆
int det_calculation(int det[][Max], int n);//计算行列式
int det_M(int det[][Max], int n, int j);//计算行列式余子式

int main(void) {
	//定义行列式阶数
	int n;
	//定义矩阵与行列式
	int matrix1[Max][Max], matrix2[Max][Max], det[Max][Max];
	//功能选择键
	int function;
	printf("请选择功能按键:\n");
	menu();
	//循环实现数值计算系统
	while (1) {
		scanf("%d", &function);
		if (function == 0)
			break;
		if (function == 1) {
			put_det(det, &n);
			printf("行列式det的值为:%d\n", det_calculation(det, n));
			menu();
		}
		if (function == 2)
			Matrix_Transpose(matrix1);
		if (function == 3)
			Matrix_Multiply(matrix1, matrix2);
		if (function == 4) {
			Matrix_Inverse(matrix1);
		}
	}
	return 0;
}

//菜单界面:功能选择
void menu() {
	printf("===================\n");
	printf("0.退 出 系 统\n");
	printf("1.计 算 行 列 式\n");
	printf("2.矩 阵 的 转 置\n");
	printf("3.求 矩 阵 的 积\n");
	printf("4.求 矩 阵 的 逆\n");
	printf("===================\n");
}

//输入矩阵
void put_matrix(int matrix[][Max], int *r, int *c) {
	//输入一个矩阵
	printf("请输入矩阵行数列数:");
	scanf("%d%d", r, c);
	printf("请输入矩阵:\n");
	for (int i = 0; i < *r; i++) {
		for (int j = 0; j < *c; j++) {
			scanf("%d", &matrix[i][j]);
		}
	}
}

//输入行列式
void put_det(int det[][Max], int *n) {
	printf("请输入行列式的阶数:");
	scanf("%d", n);
	printf("请输入行列式det:\n");
	for (int i = 0; i < *n; i++) {
		for (int j = 0; j < *n; j++) {
			scanf("%d", &det[i][j]);
		}
	}
}

//矩阵转置
void Matrix_Transpose(int matrix[][Max]) {
	//定义矩阵行列数
	int r, c;
	put_matrix(matrix, &r, &c);
	//求矩阵的转置并输出
	printf("矩阵matrix的转置结果是:\n");
	for (int i = 0; i < c; i++) {
		for (int j = 0; j < r; j++) {
			printf("%-2d", matrix[j][i]);
		}
		printf("\n");
	}
	menu();
}

//矩阵求积
void Matrix_Multiply(int matrix1[][Max], int matrix2[][Max]) {
	//定义两个矩阵的行列数
	int r1, c1, r2, c2;
	put_matrix(matrix1, &r1, &c1);
	//输入第二个矩阵
	put_matrix(matrix2, &r2, &c2);
	//定义一个新的矩阵来表示两个矩阵的积
	int matrix3[Max][Max] = {0};
	//求矩阵的积
	if (c1 != r2) {
		printf("无法计算,请重新输入...\n");
		Matrix_Multiply(matrix1, matrix2);
	} else {
		for (int i = 0; i < r1; i++) {
			for (int j = 0; j < c2; j++) {
				int j1 = 0; //定义左矩阵列数(也是右矩阵行数)
				while (j1 < c1) {
					matrix3[i][j] += matrix1[i][j1] * matrix2[j1][j];
					j1++;
				}
			}
		}
		//输出两个矩阵的积
		printf("两个矩阵的积为:\n");
		for (int i = 0; i < r1; i++) {
			for (int j = 0; j < c2; j++) {
				printf("%d  ", matrix3[i][j]);
			}
			printf("\n");
		}
		menu();
	}
}

//求行列式的值、n为阶数
int det_calculation(int det[][Max], int n) {
	int value = 0; //value是行列式的值
	if (n == 1) {
		return det[0][0];
	} else {
		for (int i = 0; i < n; i++) { //按第一行展开、i为首行列数
			value += det[0][i] * pow(-1, i) * det_M(det, n, i);
		}
	}
	return value;
}

//求行列式det余子式的值、n是阶数、i是首行列数
int det_M(int det[][Max], int n, int i) {
	//定义一个新的行列式,用来存放行列式det的余子式
	int det1[Max][Max];
	//构造出余子式
	for (int j = 0; j < n - 1; j++) {
		for (int k = 0; k < n - 1; k++) {
			if (k < i)
				det1[j][k] = det[j + 1][k];
			else if (k >= i)
				det1[j][k] = det[j + 1][k + 1];
		}
	}
	//返回det_calculation函数计算余子式的值
	return det_calculation(det1, n - 1);
}

//求矩阵的逆
void Matrix_Inverse(int matrix[][Max]) {
	//定义矩阵行列数
	int r, c;
	//定义一个新矩阵,存放矩阵中每个元素的余子式
	int matrix3[Max][Max];
	//定义一个新矩阵,表示逆矩阵
	double matrix4[Max][Max];
	//输入矩阵
	put_matrix(matrix, &r, &c);
	if (r != c) {
		printf("逆矩阵不存在!\n");
		menu();
	} else {
		int A = det_calculation(matrix, r); //矩阵的行列式的值,判断逆矩阵是否存在
		if (A == 0) {
			printf("逆矩阵不存在!\n");
			menu();
		} else {
			if (r == 1) {
				printf("所求逆矩阵为:\n");
				printf("%.2f\n", matrix[0][0] / A );
				menu();
			} else {
				//外面两个for循环遍历矩阵
				for (int t = 0; t < r; t++) {
					for (int j = 0; j < r; j++) {
						//里面两个for循环构造矩阵里每个元素的余子式
						for (int i = 0; i < r - 1; i++) {
							for (int k = 0; k < r - 1; k++) {
								matrix3[i][k] = matrix[i >= t ? i + 1 : i][k >= j ? k + 1 : k];
							}
						}
						//求逆矩阵
						matrix4[j][t] = pow(-1, t + j) * det_calculation(matrix3, r - 1) / A;
					}
				}
				//输出逆矩阵
				printf("逆矩阵为:\n");
				for (int i = 0; i < r; i++) {
					for (int j = 0; j < r; j++) {
						printf("%-16.6lf", matrix4[i][j]);
					}
					printf("\n\n");
				}
				menu();
			}
		}
	}
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-06 15:04:14  更:2021-12-06 15:05:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:08:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码