java 伴随矩阵_C#计算矩阵的逆矩阵方法实例分析

本文实例讲述了C#计算矩阵的逆矩阵方法。分享给大家供大家参考。具体如下:

1.代码思路

1)对矩阵进行合法性检查:矩阵必须为方阵

2)计算矩阵行列式的值(Determinant函数)

3)只有满秩矩阵才有逆矩阵,因此如果行列式的值为0(在代码中以绝对值小于1E-6做判断),则终止函数,报出异常

4)求出伴随矩阵(AdjointMatrix函数)

5)逆矩阵各元素即其伴随矩阵各元素除以矩阵行列式的商

2.函数代码

(注:本段代码只实现了一个思路,可能并不是该问题的最优解)

///

/// 求矩阵的逆矩阵

///

///

///

public static double[][] InverseMatrix(double[][] matrix)

{

//matrix必须为非空

if (matrix == null || matrix.Length == 0)

{

return new double[][] { };

}

//matrix 必须为方阵

int len = matrix.Length;

for (int counter = 0; counter < matrix.Length; counter++)

{

if (matrix[counter].Length != len)

{

throw new Exception("matrix 必须为方阵");

}

}

//计算矩阵行列式的值

double dDeterminant = Determinant(matrix);

if (Math.Abs(dDeterminant) <= 1E-6)

{

throw new Exception("矩阵不可逆");

}

//制作一个伴随矩阵大小的矩阵

double[][] result = AdjointMatrix(matrix);

//矩阵的每项除以矩阵行列式的值,即为所求

for (int i = 0; i < matrix.Length; i++)

{

for (int j = 0; j < matrix.Length; j++)

{

result[i][j] = result[i][j] / dDeterminant;

}

}

return result;

}

///

/// 递归计算行列式的值

///

/// 矩阵

///

public static double Determinant(double[][] matrix)

{

//二阶及以下行列式直接计算

if (matrix.Length == 0) return 0;

else if (matrix.Length == 1) return matrix[0][0];

else if (matrix.Length == 2)

{

return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];

}

//对第一行使用“加边法”递归计算行列式的值

double dSum = 0, dSign = 1;

for (int i = 0; i < matrix.Length; i++)

{

double[][] matrixTemp = new double[matrix.Length - 1][];

for (int count = 0; count < matrix.Length - 1; count++)

{

matrixTemp[count] = new double[matrix.Length - 1];

}

for (int j = 0; j < matrixTemp.Length; j++)

{

for (int k = 0; k < matrixTemp.Length; k++)

{

matrixTemp[j][k] = matrix[j + 1][k >= i ? k + 1 : k];

}

}

dSum += (matrix[0][i] * dSign * Determinant(matrixTemp));

dSign = dSign * -1;

}

return dSum;

}

///

/// 计算方阵的伴随矩阵

///

/// 方阵

///

public static double[][] AdjointMatrix(double [][] matrix)

{

//制作一个伴随矩阵大小的矩阵

double[][] result = new double[matrix.Length][];

for (int i = 0; i < result.Length; i++)

{

result[i] = new double[matrix[i].Length];

}

//生成伴随矩阵

for (int i = 0; i < result.Length; i++)

{

for (int j = 0; j < result.Length; j++)

{

//存储代数余子式的矩阵(行、列数都比原矩阵少1)

double[][] temp = new double[result.Length - 1][];

for (int k = 0; k < result.Length - 1; k++)

{

temp[k] = new double[result[k].Length - 1];

}

//生成代数余子式

for (int x = 0; x < temp.Length; x++)

{

for (int y = 0; y < temp.Length; y++)

{

temp[x][y] = matrix[x < i ? x : x + 1][y < j ? y : y + 1];

}

}

//Console.WriteLine("代数余子式:");

//PrintMatrix(temp);

result[j][i] = ((i + j) % 2 == 0 ? 1 : -1) * Determinant(temp);

}

}

//Console.WriteLine("伴随矩阵:");

//PrintMatrix(result);

return result;

}

///

/// 打印矩阵

///

/// 待打印矩阵

private static void PrintMatrix(double[][] matrix, string title = "")

{

//1.标题值为空则不显示标题

if (!String.IsNullOrWhiteSpace(title))

{

Console.WriteLine(title);

}

//2.打印矩阵

for (int i = 0; i < matrix.Length; i++)

{

for (int j = 0; j < matrix[i].Length; j++)

{

Console.Write(matrix[i][j] + "\t");

//注意不能写为:Console.Write(matrix[i][j] + '\t');

}

Console.WriteLine();

}

//3.空行

Console.WriteLine();

}

3.Main函数调用

static void Main(string[] args)

{

double[][] matrix = new double[][]

{

new double[] { 1, 2, 3 },

new double[] { 2, 2, 1 },

new double[] { 3, 4, 3 }

};

PrintMatrix(matrix, "原矩阵");

PrintMatrix(AdjointMatrix(matrix), "伴随矩阵");

Console.WriteLine("行列式的值为:" + Determinant(matrix) + '\n');

PrintMatrix(InverseMatrix(matrix), "逆矩阵");

Console.ReadLine();

}

4.执行结果

034a0816ae064381f78c0362337953e0.png

希望本文所述对大家的C#程序设计有所帮助。

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

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

相关文章

java 代码造假_老板居然让我在Java项目中“造假”

1. 前言老板说&#xff0c;明天甲方要来看产品&#xff0c;你得造点数据&#xff0c;而且数据必须是“真”的&#xff0c;演示效果要好看一些&#xff0c;这样他才会买我们的产品&#xff0c;我好明年给你换个嫂子。一般开发接到这种过分要求都不会很乐意去做&#xff0c;这完全…

nginx php环境搭建_php+nginx环境配置

本篇文章的内容是PHP和nginx环境的配置&#xff0c;在这里分享给大家&#xff0c;也给有需要的朋友一个参考phpnginx环境配置1、首先需要准备的应用程序包。nginx&#xff1a;nginx/Windows-1.0.4php&#xff1a;php-5.2.16-nts-Win32-VC6-x86.zip (nginx下php是以FastCGI的方式…

javaone_旅行报告:JavaOne 2013 –重归荣耀

javaone我已经回来几天了&#xff0c;需要赶上过去几天一直搁置的所有事情。 对我来说&#xff0c;这是一年中最忙的时间。 JavaOne和OpenWorld在旧金山的整整一周。 一个非常简短的旅行报告。 年度ACED简报 你们中许多人都知道我是Oracle社区认可计划&#xff08;称为“ ACE计…

php如何禁用浏览器的缓存,php如何禁止浏览器使用缓存页面

【摘要】PHP即“超文本预处理器”&#xff0c;是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言&#xff0c;与C语言类似&#xff0c;是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。下面是php如何禁止浏览器使用缓存页面&#xff0c;让我…

使用Java EE和OIDC构建Java REST API

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 Java EE允许您使用JAX-RS和JPA快速轻松地构建Java REST API。 Java EE是保护伞标准规…

通过JavaFX标注制作动画效果

在本文中&#xff0c;您将学习如何使用JavaFX的动画API创建标注。 您可以在https://www.youtube.com/watch?vXTHbB0LRdT4的 YouTube网站上查看这些标注的演示示例。 什么是标注&#xff1f; 我敢肯定&#xff0c;您已经看过广告或科幻电影&#xff0c;它们使用在图像顶部显示…

使用trackBy启动流程

仍然沿用Corda Services的趋势&#xff0c;我还有其他一些技巧可帮助您的CorDapp顺利工作。 这次&#xff0c;我们将重点关注使用trackBy从服务内部启动流以及如果您不小心可能会引起的离散问题。 这应该是一个相对简短的职位&#xff0c;因为我可以依靠之前的职位&#xff1a…

java+springmvc+vo,springmvc+mybatis的实例详解

前面讲到&#xff1a;SpringSpringMVCMyBatis深入学习及搭建(十三)——SpringMVC入门程序(二)1.需求使用springmvc和mybatis完成商品列表查询。2.整合思路springmvcmybatis的系统架构&#xff1a;第一步&#xff1a;整合dao层mybatis和spring整合&#xff0c;通过spring管理map…

了解为什么这个直观的工具是您团队的通用团队管理工具

每个项目管理工具都试图做同样的工具性工作&#xff1a;保持团队联系&#xff0c;按任务执行和按时完成重大计划。 但是市场变得非常拥挤&#xff0c;并且有充分的理由-没有平台似乎对人们需要看的东西以及应该如何显示这些信息具有正确的感觉&#xff0c;以便它们既可行又相关…

模型服务:流处理与使用Java,gRPC,Apache Kafka,TensorFlow的RPC / REST

机器学习/深度学习模型可以通过不同的方式进行预测。 我的首选方法是将分析模型直接部署到流处理应用程序&#xff08;如Kafka Streams或KSQL &#xff09;中。 您可以例如使用TensorFlow for Java API 。 这样可以实现最佳延迟和外部服务的独立性。 在我的Github项目中可以找到…

拥抱模块化Java平台:Java 10上的Apache CXF

Java 9版本终于将Project Jigsaw交付给大众已经过去了一年多的时间。 这是一段漫长的旅程&#xff0c;但是在那里&#xff0c;所以发生了什么变化&#xff1f; 这是一个很好的问题&#xff0c;答案并不明显和直接。 总的来说&#xff0c; 拼图项目是一种颠覆性的变化&#xff…

建立无服务器的“ Hello World”功能

无服务器 &#xff0c;功能即服务&#xff08;FaaS&#xff09;或仅具有云功能&#xff0c;就可以编写将在云中运行的代码。 您可以使用多种不同的语言&#xff08;例如JavaScript&#xff08;Node.js&#xff09;&#xff0c;Swift&#xff0c;Python&#xff0c;Java&#xf…

oracle 10g 分区管理,Oracle 10g分区表的自动维护

Oracle 10g分区表不支持自动化管理&#xff0c;一般都要手动创建分区&#xff0c;手动删除。今天给大家带来了一个自动化管理表空间的脚本。本脚本主要由3个部分组成&#xff1a;sys_ConfigTable.sql、sys_pro_AddAndDropPartition.sql、sys_pro_MergeTable.sql1、sys_ConfigTa…

java实现metro风格_Metro风格的Java组合框(JMetro)–重新介绍

java实现metro风格我上一篇关于JMetro的文章–我的都市风格的Java皮肤&#xff08;或外观&#xff09;是关于日历选择器控件的 。 我本打算使用Tom Eugelink不错的日历选择器&#xff0c;但当时我了解到它是由Oracle创建并随Java 8一起提供的&#xff0c;因此出于时间的考虑&am…

toad查看oracle的plsql包,Oracle logminer 分析redo log(TOAD与PLSQL)

Oracle logminer 分析redo logOracle 11g r2 RAC centos 6.5设置时间格式select to_char(sysdate,yyyy-mm-dd hh24:mi:ss) date_format from dual ;查看数据库是否开启补全日志功能selectSUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI,SUPPLEM…

Nutshell中的Java 8语言功能-第2部分

编者注&#xff1a;您也可以在此处检查Part-1。 嗨&#xff0c;朋友们&#xff0c;这是简明系列的Java 8语言功能的第2部分。 在这里&#xff0c;我们将讨论Java 8的以下功能&#xff1a; 接口中的静态方法 流 1.接口中的静态方法 什么是静态方法&#xff1f; 静态方法是属…

梯度下降法、最速下降法

梯度下降法 最优化问题是求解函数极值的问题&#xff0c;包括极大值和极小值。相信所有的读者对这个问题都不陌生&#xff0c;在初中时我们就学会了求解二次函数的极值&#xff08;抛物线的顶点&#xff09;&#xff0c;高中时学习了幂函数&#xff0c;指数函数&#xff0c;对…

超越函数

代数数 在数论中&#xff0c;超越数是指任何一个不是代数数的数字&#xff08;通常它是复数&#xff09;。它满足以下条件——只要它不是任何一个整系数代数方程的根&#xff0c;它即是超越数。最著名的超越数是e以及π。 超越数 超越数的例子 所有超越数构成的集是一个不可数…

只需5分钟即可启动并运行分层架构:: Spring Boot第1部分

这是一个分为两部分的系列&#xff0c;其中我将展示如何使用Spring Boot创建分层架构。 什么是分层体系结构&#xff1a;简而言之&#xff0c;当我们构建企业应用程序时&#xff0c;我们维护不同的层以封装特定于层的逻辑&#xff0c;这样就不会溢出到另一层。 当我们考虑企业…