前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >线性代数行列式方程求解(正交矩阵的行列式)

线性代数行列式方程求解(正交矩阵的行列式)

作者头像
全栈程序员站长
发布于 2022-07-28 12:13:50
发布于 2022-07-28 12:13:50
1K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

C++代码实现行列式求值

线性代数行列式求值算的可真是让人CPU疼,但计算机是不累的,所以用一个c++程序帮助你验证求解行列式的值吧。

行列式求值的基本思路

行列式求值主要有以下这几种思路:

  1. 行列式等于它的任意列(或行)各个元素与其对应代数余子式乘积的和。
  2. 直接利用行列式的定义(逆序数)求解
  3. 利用行列式的性质做初等变换在求解:
  • 性质1:互换行列式的两列(或两行),行列式仅改变符号。
  • 性质2:行列式某行(或某列)的 k 倍加到另一行(或列)上,行列式不变。

思路一——行列式展开

首先再次介绍下余子式和代数余子式:

  • 余子式:在 n 阶行列式中,把某个元素所在的行列都去掉之后,剩下的 n-1 阶行列式就叫做该元素的余子式:
  • 代数余子式: 余子式再乘以-1的i+j次方(ij为行列式的行和列)

**我们可以看到行列式展开得到的代数余子式又是一个行列式,这是一个逐步求精的过程。显然可以用递归的方法。 基本算法:

  1. 行列式按第一行展开:
  2. 循环求各个元素与其对应代数余子式乘积的和。
  3. 其中余子式求值递归为行列式求值
  4. 递归终止条件: 行列式阶数为1,返回该数

下面给出两种递归的方法:**

不利用辅助函数的递归:

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
double cal(double **det,int n)//det-行列式,n:行列式的阶数
{ 
   
	double detVal = 0;//行列式的值
	
	if(n == 1)//递归终止条件 
	return det[0][0]; 
	
	double **tempdet = new double *[n-1];//用来存储余相应的余子式
	 for(int i=0;i<n-1;i++)
	  tempdet[i] = new double[n-1];
	for(int i=0;i<n;i++)//第一重循环,行列式按第一行展开 
	{ 
   
		for(int j=0;j<n-1;j++)
		for(int k=0;k<n-1;k++)
		{ 
   
			if(k <i)
			tempdet[j][k]=det[j+1][k] ;
			else
			tempdet[j][k]=det[j+1][k+1];
		}
		detVal += det[0][i] * pow(-1.0,i) * cal(tempdet,n-1);
	
	 } 
	 return detVal;
} 
辅助函数递归

这一种构建了一个辅助函数,可以更加直观的理解此递归算法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//获得det[i][j]余子式行列式 
vector<vector<double> > getComplementMinor(vector<vector<double> > det,int i,int j) ;
//获得行列式det的值 
double getDetVal(vector<vector<double> > det);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//获得det[i][j]余子式行列式 
vector<vector<double> > getComplementMinor(vector<vector<double> > det,int i,int j) 
{ 
      
     
	int n=det.size(),m=det[0].size();//n为det的行,m为det的列;
	vector<vector<double> > ans(n-1);//保存获得的结果
	for(int k=0;k<n-1;k++)
	for(int l=0;l<n-1;l++)
	{ 
   
		ans[k].push_back(det[k<i?k:k+1][l<j?l:l+1]);
	}
	return ans;
}

double getDetVal(vector<vector<double> > det)
{ 
      
    double ans=0;
	int n=det.size(),m=det[0].size();//n为det的行,m为det的列;
	if(n != m)
    { 
   
    	 cout<<" 您输入的矩阵不是方阵!求么子行列式!";
    	 exit(1);
	} 
	if(det.size() == 1)
	return det[0][0];
	
	for(int i=0;i<m;i++)
	{ 
   
		ans+=det[0][i] * pow(-1,i)*getDetVal(getComplementMinor(det,0,i));
	}
	return ans;
}
奉上一个完整代码,可以直接根据提示计算
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<bits/stdc++.h>
using namespace std;

double cal(double **det,int n)//det-行列式,n:行列式的阶数
{ 
   
	double detVal = 0;//行列式的值
	
	if(n == 1)//递归终止条件 
	return det[0][0]; 
	
	double **tempdet = new double *[n-1];//用来存储余相应的余子式
	 for(int i=0;i<n-1;i++)
	  tempdet[i] = new double[n-1];
	for(int i=0;i<n;i++)//第一重循环,行列式按第一行展开 
	{ 
   
		for(int j=0;j<n-1;j++)
		for(int k=0;k<n-1;k++)
		{ 
   
			if(k <i)
			tempdet[j][k]=det[j+1][k] ;
			else
			tempdet[j][k]=det[j+1][k+1];
		}
		detVal += det[0][i] * pow(-1.0,i) * cal(tempdet,n-1);
	
	 } 
	 return detVal;
} 
int main()
{ 
   
	int n;
	cout<<" 输入行列式的阶数:"; 
	cin >> n;//输入行列式的阶数 
	double **det = new double *[n];//需要动态内存 
	for(int i=0;i<n;i++)
       det[i] = new double[n];
	  

	
	cout<<" 输入行列式:"<<endl;
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
     cin >> det[i][j];
     
     cout<<" 该行列式的值为:"<<cal(det,n);
	
}

思路二——逆序数全排列

思路三——初等变换

调试分析

第一种方法在精度上较好,但计算的阶数有限;后两者运算速度会比较好。但是本人最近较忙,后两者暂未给出(不要打我)- . -。 做题时用第一种方法完全可以帮你解决线性代数的问题。

实现线代其它操作的参考链接

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128986.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Tomcat 安装和简单使用
ApacheTomcat 是 JakartaEE (正式的 JavaEE)技术的一个子集的开放源码软件实现。ApacheTomcat 的不同版本可用于规范的不同版本。规范和相应的 Apache Tomcat 版本之间的映射如下:
acc8226
2022/11/16
7510
Tomcat 安装和简单使用
Tomcat配置
    Tomcat是轻量级的Web应用服务器,可以从官网http://tomcat.apache.org下载最新的Tomcat服务器版本。下载完成后直接解压Tomcat文件到指定的目录下。
Tacc
2022/05/05
1K0
Tomcat_总结_02_单机多实例
上图中的 CATALINA_HOME 指Tomcat安装路径,CATALINA_BASE 指实例所在位置。 CATALINA_HOME 路径下只需要包含 bin 和 lib 目录,而 CATALINA_BASE 只存放 conf、webapps、logs 等这些文件,
shirayner
2018/08/10
3460
Tomcat_总结_02_单机多实例
谈谈tomcat引起的中文乱码问题
平时在使用tomcat做一些服务的时候经常遇到各种乱码问题,要么是控制台输出乱码或者输出日志乱码,要么页面接收乱码,非常烦人。引起乱码的原因多个,从网上学习了很多,现在尝试简单总结给大家分享
用户5521279
2019/06/02
22.7K0
Web基础配置篇(三): tomcat的配置及使用
tomcat,大家应该都知道是啥,servlet的Web容器而已,遵守servlet规范的JavaEE服务器。我们通常用tomcat来部署war包来做应用服务器。
品茗IT
2019/09/11
5780
Tomcat的源码分析
总结 : 由上面摘抄的主要源码可知 ,在catalina.bat 启动时 ,主要是加载了一个叫bootstrap.jar 的jar包 . 在加载这个jar 以后 ,他又运行了这个 jar 下面的org.apache.catalina.startup.Bootstrap 这个类, 通过set ACTION=start 启动他的main方法 ,完成对Tomcat的启动
时间静止不是简史
2020/07/24
9850
Tomcat的源码分析
Tomcat启动一闪而过就消失的原因和解决方法
Tomcat启动一闪而过怎么办?这成为了许多刚接触tomcat开发环境工作者的一个大问题,许多用户朋友都不知道是因为什么问题导致出现这种情况,下面就一起来了解一下吧。
全栈程序员站长
2022/06/25
2.1K0
Tomcat启动一闪而过就消失的原因和解决方法
Tomcat
JavaWeb 是指,所有通过 Java 语言编写可以通过浏览器访问的程序的总称,叫 JavaWeb。
一个风轻云淡
2022/11/15
1.1K0
Tomcat
tomcat详细安装及配置教程_tomcat安装及配置
2、Download下边的版本,这里最新的是10.0x,但是一般不选最新版本,我选择的是8.5x,所以点击Download下边的Tomcat 8
全栈程序员站长
2022/10/02
8200
tomcat详细安装及配置教程_tomcat安装及配置
Java开发环境系列:一篇能帮你解决99%线上问题的Tomcat排雷日记
下载地址:https://archive.apache.org/dist/tomcat/
架构师小跟班
2019/08/06
9220
Java开发环境系列:一篇能帮你解决99%线上问题的Tomcat排雷日记
Java知识:(3)Tomcat
压缩版:window(rar,zip) linux(tar,tar.gz)学习时候使用
py3study
2020/01/08
6130
Java知识:(3)Tomcat
Tomcat
Tomcat服务器由Apache提供,开源免费。由于Sun和其他公司参与到了Tomcat的开发中,所以最新的JSP/Servlet规范总是能在Tomcat中体现出来。当前最新版本是Tomcat8,我们课程中使用Tomcat7。Tomcat7支持Servlet3.0,而Tomcat6只支持Servlet2.5!
eadela
2019/09/29
1.5K0
Tomcat
【JavaEE WEB 开发】Tomcat 详解 Servlet 入门
转载请注明出处 :  http://blog.csdn.net/shulianghan/article/details/47146817
韩曙亮
2023/03/27
3630
【JavaEE WEB 开发】Tomcat 详解 Servlet 入门
tomcat 9.0.4 性能调优
参考了网上的一些优化参数,但是在启动中发现 有2个报错: 11-Feb-2018 15:57:23.293 警告 [main] org.apache.catalina.startup.SetAllPropertiesRule.begin [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'maxSpareThreads' to '200' did not find a matching property. 11-Feb-2
拓荒者
2019/03/15
5410
Tomcat配置环境变量
Tomcat是目前比较流行的开源且免费的Web应用服务器,在我的电脑上第一次安装Tomcat,再经过网上教程和自己的摸索后,将这个过程 重新记录下来,以便以后如果忘记了可以随时查看。
全栈程序员站长
2022/08/19
1.9K0
Tomcat配置环境变量
Tomcat讲解
点击startup.bat启动失败,我就用cmd命令打开,发现是没有JAVA_HOME 环境。这是因为电脑上没有配置JAVA_HOME或者JRE_HOME导致的
Albert_xiong
2021/06/21
8010
Tomcat讲解
【Java框架型项目从入门到装逼】第三节 - 如何用Tomcat发布web项目?
啥叫Tomcat?有道词典是这么说的。 image.png 这个我们姑且不管,实际上呢,Tomcat是一种Web服务器,我们自己做好了一个Web项目,就可以通过Tomcat来发布。服务器呢,又分为硬件
剽悍一小兔
2018/05/17
9050
Tomcat 的安装与环境配置教程(超详细)
1、下载Tomcat1>官网:Apache Tomcat® - Apache Tomcat 9 Software Downloads这里我选择的是Tomcat9.0  64bit   Windows(作为示例安装)(如图紫色框中所示)---自行下载安装
楠羽
2022/11/18
35.5K0
Tomcat 的安装与环境配置教程(超详细)
Tomcat服务器
不论是我们一开始做的java桌面程序、控制台程序以及socket gui界面程序(这个我还没学),都是服从Javase规范的。接下来我们要学习的将是Javaweb程序,服从javaee规范。 目前的软件有两种,一是C/S(客户端—服务器)模式,向像我们常用的QQ这一类的软件,这类软件要求我们必须下载客户端,而且还随着服务器的迭代而升级。另外一种就是B/S(浏览器–服务器)模式,比如你现在浏览的CSDN我的博客,也就是大多数的网站都是这种模式的,所以我们只需要有一个浏览器就行了。而且有一个和C/S程序相反的优点,就是我们不必在服务器升级之后升级浏览器了。 Javaweb的程序就是B/S结构的。
roobtyan
2019/02/21
1.8K0
Tomcat 快速入门
Tomcat 快速入门 版本说明 本文使用 Tomcat 版本为 Tomcat 8.5.24。 Tomcat 8.5 要求 JDK 版本为 1.7 以上。 简介 Tomcat 是什么 Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对 Servlet 和 JSP 的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 由于 Tomcat 本身也内含了一个 HTTP 服务器,它也可以被视作一个单独的 Web 服务器。但是
静默虚空
2018/03/16
1.5K0
Tomcat 快速入门
相关推荐
Tomcat 安装和简单使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验