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,一经查实,立即删除!

相关文章

apache camel_探索Apache Camel Core –文件组件

apache camel文件轮询器是解决常见IT问题的非常有用的机制。 Camel的内置file组件非常灵活&#xff0c;并且有许多选项可用于配置。 让我们在这里介绍一些常用用法。 轮询目录以输入文件 这是一条典型的骆驼Route用于每秒轮询一次目录以查找输入文件。 import org.slf4j.*; i…

java list 遍历 remove_JAVA中LISt遍历时如何remove元素?

import java。util。*;  public class object {  public static void main(String[] args) {  String str1 new String("abcde");  String str2 new String("abcde");  String str3 new String("abcde");  String str4 new Stri…

Java使用者的延期执行

在前面的博客文章&#xff08;“ 延迟执行Java的供应商 “&#xff09;&#xff0c;我引用礁HORSTMANN的陈述书中‘ 的Java SE8为真的很急关于lambda表达式’&#xff0c;‘所有的lambda表达式的点被推迟执行 。’ Horstmann在最后一年为Dobb博士的杂志写了一篇名为“ Java 8中…

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是保护伞标准规…

php 长微博程序,长微博生成工具PHP源码 根据文字生成长微博图片 - substr_count

&#xfeff;PHP substr_count() 函数定义和用法substr_count() 函数计算子串在字符串中出现的次数。语法substr_count(string,substring,start,length)...] rtrim($matches[3],\"/);//获取图片的id$parent_dir_num substr_count( $matches[3], ../);$relative_dirname …

php 加密类,php加密类

这篇文章的主要内容是介绍了关于php加密类 &#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下namespace app\index\controller;class Crypt{private $key "";public function __construct($key null){if (!is_null($…

通过JavaFX标注制作动画效果

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

php 继承内核中的基类,继承类上的PHP new self()正在创建一个基类对象

参见英文答案 > New self vs. new static 3个我有一个充当基类的类.然后我有几个继承它的类.我想开始使用静态语法加载继承的类,但行为没有多大意义.直到现在我加载了这样的类,它完成了这项工作.$obj new foo();$something $obj->B…

使用trackBy启动流程

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

过防火墙一句话php2017,dedeCMS友情链接getshell漏洞利用

1.php//print_r($_SERVER);$referer $_SERVER[HTTP_REFERER];$dede_login str_replace("friendlink_main.php","",$referer);//去掉friendlink_main.php&#xff0c;取得dede后台的路径//拼接 exp$muma .;$exp tpl.php?actionsavetagfile&actiond…

java 1.8新增功能_Java 8的新增功能(第二部分-可能会出现什么)

java 1.8新增功能免责声明&#xff1a;我不为Oracle工作&#xff0c;也不以任何方式代表Oracle。 此功能列表不是官方的。 作为“局外人”&#xff0c;这只是我研究的一部分。 这是由三部分组成的系列文章的第二部分。 在第一部分中 &#xff0c;我谈到了Oracle正式让开发人员…

Spring应用架构

我最近收到我博客的一位读者Ajay的问题&#xff0c;并决定在此处分享我的答案&#xff0c;以帮助其他有类似问题的人。 这是来自阿杰的问题&#xff1a; 大卫您好&#xff0c;我想知道我最近遇到的两种MVC应用程序体系结构之间的区别&#xff1a; 1&#xff09;在普通的Spri…

PHP能不能让一串代码现实,一段让你认清现实的Java代码.java

/*** 答致命三问* 终回归现实*/public static void main(String[] args) {boolean a false,b false,c false;java.util.Scanner scanner new java.util.Scanner(System.in);System.out.println(decode("5oKo5aSa6auY77yIY23vvInvvJ8"));int height 0;while (hei…

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

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

java是面向过程的编程语言吗,下列关于Java语言特点的叙述中,错误的是()。 A.Java是面向过程的编程语言B.Java支持分...

查询最近30天的记录应使用( )作为准则某企业年度主营业务收入为以下关于第一层ISP特征的描述中,错误的是测量电压时&#xff0c;应将数字万用表与被测电路并联。()HLAⅡ类分子主要分布于在铁碳合金相图中今年来,公务员逐渐成为广大高校毕业生所青睐的热门职业,但是报考公务员必…

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

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