C语言用高斯消元法求行列式

news2024/11/24 2:40:17

目录

数学原理

程序设计

整体流程与代码

测试函数

测试结果


数学原理

高斯消元法求行列式:利用初等行变换,化为上三角行列式,求其主对角线的乘积

行列式的初等行变换:

1)换行变换:交换两行(行列式需变号)

2)倍法变换:将行列式的某一行(列)的所有元素同乘以数k(行列式需乘K倍)

3)消法变换:把行列式的某一行(列)的所有元素乘以一个数k并加到另一行(列)的对应元素上(行列式不变)

上述三种变化中,本章只利用第三个消法变换。 

例如:

行列式A为:

化为上三角行列式:

注:这里的-0.0667是打印时保留四位的结果,其实是-0.066...6667,-3.6667亦然(因为浮点数在计算机中存储的特性,高斯消元法也会损失一点点精度)。

行列式是值为:

det(A)=15 × -0.0666666667 × -6 × 2 =12

程序设计

整体流程与代码

1)判断传入指针是否为空

2)判断矩阵维数,判断是否为方阵

3)为临时矩阵开辟空间

4)将原矩阵数据拷贝到临时矩阵中(保护原矩阵)

5)利用初等行变换,找出每列绝对值最大的数,将该行加到其他行上(1.提高一定的精度 2.避免原函数主对角线有0,需要换行的情况)

6)逐列开始,进行消0操作 

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

double Det(double** src)
{
	//step 1
	//判断指针是否为空
	if (src == NULL)exit(-1);
	int i, j, k, row, col;
	double sum,** res;
	int count = 0;
	//判断矩阵维数
	row = (double)_msize(src) / (double)sizeof(double*);
	col = (double)_msize(*src) / (double)sizeof(double);
	if (row != col)exit(-1);
	//step 2
	res = (double**)malloc(sizeof(double*) * row);
	for (i = 0; i < row; i++)
	{
		res[i] = (double*)malloc(sizeof(double) * row);
		memset(res[i], 0, sizeof(res[0][0]) * row);//初始化
	}
	//step 3
	//进行数据拷贝
	for (i = 0; i < row; i++)
	{
		memcpy(res[i], src[i], sizeof(res[0][0]) * row);
	}
	//step 4
	//每列元素找出最大那一行,加到其他行
	for (j = 0; j < col; j++)
	{
		count = 0;
		double Max = fabs(res[count][j]);//用绝对值比较
		//默认第一行的数最大
		for (i = 0; i < row; i++)
		{
			if (fabs(res[i][j]) > Max)
			{
				count = i;
				Max = fabs(res[i][j]);
			}
		}
		for (i = 0; i < row; i++)
		{
			if (i == count)continue;
			for (k = 0; k < col; k++)
			{
				res[i][k] += res[count][k];
			}
		}
	}
	//step 5
	for (j = 0; j < col; j++)
	{
		//将每列其他元素化0
		for (i = j+1; i < row; i++)
		{
			double b = res[i][j] / res[j][j];
			for (k = 0; k < col; k++)
			{
				res[i][k] += b * res[j][k] * (-1);//初等行变换
			}
		}
	}
	sum = 1;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (i == j)
				sum *= res[i][j];
		}
	}
	//必须释放res内存!
	free(res);
	return sum;
}

上述代码中:

  • malloc函数在动态内存规划一文中有详细讲解
  • 判断矩阵维数在C语言判断矩阵维数中有详细讲解
  • 行列式必须是方阵,因此row和col是相等的,代码中row对应行操作,col对应列操作
  • 因为高斯消元法是化为上三角行列式,所以每次消元时,起始的行数i=j+1,上三角部分不用消0
  • 最后只需要返回三角行列式主对角元素的乘积即可,在函数末尾需要释放内存

 

测试函数

为了方便测试,创建三个测试函数

创建矩阵函数:

double** MakeMat(int n)
{
	int i = 0;
	if (n <= 0)exit(-1);
	double** res = (double**)malloc(sizeof(double*) * n);
	if (res == NULL)exit(-1);
	for (i = 0; i < n; i++)
	{
		res[i] = (double*)malloc(sizeof(double) * n);
	}
	return res;
}

初始化函数:

void InitMat(double** src)
{
	if (src == NULL)exit(-1);
	int i, j, n;
	n = (double)_msize(src) / (double)sizeof(double*);
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			src[i][j] = pow(i, j);
		}
	}
}

初始化为i的j次方 

打印函数:

void print(double** src)
{
	if (src == NULL)exit(-1);
	putchar('\n');
	int i, j, row, col;
	row = (double)_msize(src) / (double)sizeof(double*);
	col = (double)_msize(*src) / (double)sizeof(double);
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf("%9.4lf", src[i][j]);
		}
		putchar('\n');
	}
}

测试结果

int main()
{
	int n = 4;
	double** arr = MakeMat(n);
	InitMat(arr);
	printf("原行列式:>");
	print(arr);
	printf("上三角行列式:>");
	double res = Det(arr);
	printf("计算结果:>");
	printf("%lf\n", res);
	return 0;
}

这里没有返回上三角行列式,只是在函数最后加了一个打印,对其进行观察

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53555.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

静态路由配置案例

静态路由配置案例配置静态路由原理命令&#xff1a;案例&#xff1a;最后结果&#xff1a;配置静态路由原理命令&#xff1a; [Huawei]ip route-static 来源ip 子网掩码 去向ip [Huawei]ip route-static 192.168.20.1 255.255.255.0 192.168.1.2 案例&#xff1a; pc1,pc2,a…

世界杯里的数学知识

一、前言 2022 年卡塔尔世界杯足球赛已经开幕&#xff0c;这是历史上首次在卡塔尔和中东国家境内举行、也是第二次在亚洲举行的世界杯足球赛。除此之外&#xff0c;卡塔尔世界杯还是首次在北半球冬季举行、首次由从未进过世界杯决赛圈的国家举办的世界杯足球赛。世界杯足球赛里…

凌玮科技IPO注册生效:曾踩雷理财损失2000万元,胡颖妮为董事长

11月30日&#xff0c;广州凌玮科技股份有限公司&#xff08;下称“凌玮科技”&#xff09;在深圳证券交易所创业板递交招股书&#xff08;注册稿&#xff09;。相较于此前招股书&#xff0c;凌玮科技补充披露了截至2022年9月30日的财务数据等信息&#xff0c;并对2022年度的业绩…

SimCSE:对比学习,只需要Dropout

要说2021年上半年NLP最火的论文&#xff0c;想必非《SimCSE: Simple Contrastive Learning of Sentence Embeddings》莫属。SimCSE的全称是Simple Contrastive Sentence Embedding Sentence Embedding Sentence Embedding一直是NLP领域的一个热门问题&#xff0c;主要是因为其…

独家 | AI是如何帮助创造看起来和听起来都和我们一样的仿真数码人的

作者&#xff1a;Anthony Green翻译&#xff1a;顾伟嵩 校对&#xff1a;赵茹萱本文约6000字&#xff0c;建议阅读14分钟 由AI驱动的仿真数码人正在从事娱乐、执法等工作。图来源于ERICA SNYDER/MITTR | UNSPLASH仿真数码双胞胎捕获了真实人类的外表和表情。这些复制品越来越多…

科技云报道:从百度智能云的探索,看懂边缘云的过去和未来

科技云报道原创。 布莱恩阿瑟在《技术的本质》一书中写道&#xff0c;“技术是一个异常美丽的主题&#xff0c;它不动声色地创造了财富&#xff0c;成就了经济的繁荣&#xff0c;改变了人类的生存方式。” 五年前&#xff0c;人们还不会在地铁公交上看视频&#xff0c;因为视频…

obsidian和zotero联动

前言 看了好多obsidian和zotero联动的视频和教程&#xff0c;终于还是下手了。 obsidian和zotero之所有能够完美联动&#xff0c;很大程度上建立在这两个软件都有这活跃的第三方插件市场&#xff0c;只要肯花功夫挖掘&#xff0c;我相信是能玩出花来的。 网上的多数联动是基…

如何在R语言中建立六边形矩阵热图heatmap可视化

原文链接&#xff1a;http://tecdat.cn/?p18879这是一个六边形热图可视化程序&#xff0c;主要用到的知识RColorBrewer&#xff0c;fields,也就是R中的可视化绘图库&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。本文希望SOM的结果以六边形热图可视化。让我…

JMeter入门教程(6) --脚本添加

文章目录1.添加线程组2.添加HTTP Cookie管理器3.添加HTTP请求默认值4.添加HTTP请求5.添加查看结果树1.添加线程组 1.创建JMeter测试计划的第一步就是添加线程组测试元件。线程组会告诉JMeter需要模拟的并发用户数&#xff0c;以及并发用户发送请求的频率和数目。 要添加线程组…

程序过程分析——从编译到执行

汇编源程序 mov ax,4c00H int 21H 这两条指令可以实现程序返回的功能。 编译 使用微软的masm5.0汇编编译器,文件名为masm.exe。 在编译的过程中,我们提供了一个输入,即源程序文件。最多可以得到3个输出:目标文件(.obj)、列表文件(.Ist)、交叉引用文件(.erf),这3个输…

【vue项目部署CSS失效】VUE部署后css样式加载无效和失效多种情况解决方案

【写在前面】vue3在vscode运行正常、build后在IDEA运行正常&#xff0c;但是当部署在服务器上运行发现样式加载不出来&#xff0c;下面我们针对这些情况进行复现与解决。 一、问题分析 困扰我好久&#xff0c;当即百度原因&#xff0c;百度清一色下面三种情况&#xff1a; 1、…

ARM作业,M4

使用CORTEX-M4核&#xff0c;实验中断实验和串口实验结合 gpio.c void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin) {switch(GPIO_Pin){case GPIO_PIN_7:HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_10);printf("key2 down\n");break;case GPIO_PIN_8:HAL_GPIO_Tog…

[附源码]计算机毕业设计JAVA校园兼职招聘系统

[附源码]计算机毕业设计JAVA校园兼职招聘系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

几款常用database的性能对比

建模三件套&#xff0c;database&#xff0c;algorithm&#xff0c;training data。 这个科普文章&#xff0c;让我们来对比一下市面上常见的DB的性能以及其特殊的工作方式。 市面上常见的有很多&#xff0c;但其中大厂用得比较多的主要还是这几个&#xff1a;mysql、oracle、…

2022圣诞将至,跨境卖家如何做好圣诞节营销?

不知不觉&#xff0c;2022年已正式步入12月了。伴随着“黑五”、“网一”的结束&#xff0c;跨境卖家们又要开始投入下一个大促节日圣诞节的准备中了。作为一年当中最大的购物节日&#xff0c;跨境电商们是无论如何都不能错过这个绝佳的销售机会的。 据Nox聚星了解&#xff0c…

【毕业设计】1-1Matlab小电流接地系统的建模与单相故障的仿真分析(仿真工程文件+结果图+论文+PPT)

【毕业设计】1-1Matlab小电流接地系统的建模与单相故障的仿真分析&#xff08;仿真工程文件结果图答辩论文答辩PPT&#xff09; 文章目录【毕业设计】1-1Matlab小电流接地系统的建模与单相故障的仿真分析&#xff08;仿真工程文件结果图答辩论文答辩PPT&#xff09;任务书设计说…

MySQL数据库实现主从复制,docker实现版

我这里是在同一台电脑上使用docker实现的主从复制&#xff0c;在物理机上整体思路是一致的 预备工作&#xff1a;安装好docker 使用docker运行MySQL 拉取MySQL镜像 docker pull mysql:5.7运行mysql master容器 sudo docker run -p 33061:3306 --name mysql-master-v /myda…

css3滤镜属性filter实现网页变黑白效果

前言 在特殊的日子里&#xff0c;很多网站页面都是黑白色的&#xff0c;其实用css3滤镜属性filter让网页马上变黑白&#xff0c;一行代码就搞定。 网页变黑白代码实现 方法1&#xff1a;在你的css里加上以下代码即可&#xff0c;网页马上变黑白&#xff1a; html{filter:pr…

【Spring源码系列】Spring扫描注解-@ComponentScan底层原理解读

这里写目录标题前言一、Spring扫描-ComponentScan注解介绍ComponentScan作用ComponentScan重要参数二、Spring扫描-源码分析声明关键点源代码解读Spring扫描流程图前言 先不废话了&#xff0c;直接干吧。 一、Spring扫描-ComponentScan注解介绍 ComponentScan作用 Componen…

vscode搭建LVGL开发环境

更多精彩请关注微信公众号 南山府嵌入式 关注我&#xff0c;每天只是不断 准备环境 vscode msys2 有关vscode程序的安装这里不在演示。 mysys2的安装 点击一步继续操作&#xff1a; 选择安装路径&#xff1a;然后就一直下一步等待安装即可。 安装完成后打开是这样的&#xf…