为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

C#行列式

2012-03-12 7页 doc 73KB 38阅读

用户头像

is_706981

暂无简介

举报
C#行列式using System; using System.Collections.Generic; using System.Linq; using System.Text; //自己写的一个关于矩阵各种计算的算法,还有行列式的各种算法 //简单的几步,,,嘿嘿嘿,特意分享下 namespace Task1 { class JuZhen { public double[,] arr; //矩阵的成员变量 private int row, ...
C#行列式
using System; using System.Collections.Generic; using System.Linq; using System.Text; //自己写的一个关于矩阵各种计算的算法,还有行列式的各种算法 //简单的几步,,,嘿嘿嘿,特意分享下 namespace Task1 { class JuZhen { public double[,] arr; //矩阵的成员变量 private int row, col; public double sum = 0.0; public JuZhen() { } public JuZhen(int a, int b) { row = a; col = b; } /*public void setRC(int a, int b) { row = a; col = b; } public int getR() { return row; } public int getC() { return col; }*/ public double[,] InputArr(int x, int y) //矩阵的输入函数,用于输入函数并且将输入的函数显示出来 { arr = new double[x, y]; for (int a = 0; a < x; a++) for (int b = 0; b < y; b++) arr[a, b] = double.Parse(Console.ReadLine()); Console.WriteLine("输入的矩阵为:"); OutPrint(arr, x, y); //矩阵的显示 return arr; //返回输入的矩阵 } public void OutPrint(double[,] x, int a, int b) //矩阵的输出函数,调用此函数实现矩阵的输出 { for (int i = 0; i < a; i++) { for (int j = 0; j < b; j++) { Console.Write("{0} ", x[i, j]); } Console.WriteLine(""); //输完一行后换行 } } public double[,] QiuYuZiShi(double[,] x, int a) //求行列式的代数余子式矩阵, { double[,] temp; double[,] result = new double[a, a]; for (int i = 0; i < a; i++) //i,m两个for循环对x矩阵遍历,求代数余子式 { for (int m = 0; m < a; m++) { temp = new double[a - 1, a - 1]; //生成余子式数组 for (int j = 0; j < a - 1; j++) //j为余子式列,i为行 for (int k = 0; k < a - 1; k++) { if (j < i && k < m) //判断构造的元素在去掉的列前面还是后面 行的上面还是下面 temp[k, j] = x[k, j]; if (j < i && k >= m) temp[k, j] = x[k + 1, j]; if (j >= i && k < m) temp[k, j] = x[k, j + 1]; if (j >= i && k >= m) temp[k, j] = x[k + 1, j + 1]; } double s = Math.Pow(-1, i + m); //计算余子式的符号 result[i, m] = s * QiuZhi(temp, a - 1); //得代数余子式的一项 } } return result; } public double QiuZhi(double[,] x, int a) //行列式的值函数 { double[,] temp; //声明临时矩阵数组 double s = 1.0; //用他来控制余子式的符号 double result = 0.0; //声明临时存储矩阵行列式变量和符号变量 if (a == 1) { return x[0, 0] * s; } for (int i = 0; i < a; i++) { temp = new double[a - 1, a - 1]; //给余子式数组分配空间 for (int j = 0; j < a - 1; j++) //j为余子式列,i为行 for (int k = 0; k < a - 1; k++) { if (j < i) //判断构造的元素在去掉的列前面还是后面 temp[k, j] = x[k + 1, j]; else temp[k, j] = x[k + 1, j + 1]; } s = Math.Pow(-1, i); //计算余子式的符号 result += x[0, i] * QiuZhi(temp, a - 1) * s; //用递归算法计算行列式的值 } return result; } public void Add(double[,] x, int a, int b, double[,] y, int c, int d) //矩阵的相加并且显示相加后的结果 { double[,] result = new double[a, b]; //将相加后的矩阵存放在result矩阵中 if (a != c || b != d) //对是否能进行乘法进行判断 Console.WriteLine("不是同型矩阵,不能进行加法运算"); else { for (int i = 0; i < a; i++) for (int j = 0; j < b; j++) result[i, j] = x[i, j] + y[i, j]; Console.WriteLine("矩阵相加后的结果为:"); OutPrint(result, a, b); //输出结果 } } public double[,] ZhuanZhi(double[,] x, int a, int b) //实现转置并且输出结果 { double[,] y = new double[b, a]; //用于存放转置后的结果 for (int i = 0; i < a; i++) for (int j = 0; j < b; j++) y[j, i] = x[i, j]; //第a行b列与第b行a列交换,实现转置 Console.WriteLine("矩阵转置后的结果为:"); OutPrint(y, b, a); //打印结果 return y; } public void Time(double[,] x, int a, int b, double[,] y, int c, int d) { double[,] result = new double[a, d]; //用来存放矩阵相乘后的结果 if (b != c) //判断是否能够进行矩阵的乘法运算 Console.WriteLine("x和y数组的位数不匹配,不能进行乘法运算"); else { for (int i = 0; i < a; i++) for (int j = 0; j < d; j++) { result[i, j] = 0; for (int k = 0; k < b; k++) result[i, j] += (x[i, k]) * (y[k, j]); //得到相乘后的每一项 } Console.WriteLine("矩阵相乘后的结果为:"); OutPrint(result, a, d); //打印结果 } } public void QiuNi(double[,] x, int a, int b) //实现矩阵的求逆运算,并输出结果 { double[,] result1 = new double[a, b]; //用来存放代数余子式矩阵 double[,] result2 = new double[a, b]; //用来存放求逆后的矩阵 if (a != b) Console.WriteLine("输入的行和列大小不相等,不能求逆矩阵"); else { double m; m = QiuZhi(x, a); //求出行列式的模长,进行下一步的判断 if (m == 0) //判断是否有逆矩阵 Console.WriteLine("输入矩阵的模长值为0,所以它没有逆矩阵"); else { result1 = QiuYuZiShi(x, a); //代数余子式 double n = 1 / m; for (int i = 0; i < a; i++) //一一求出逆矩阵的每一项 for (int j = 0; j < a; j++) result2[i, j] = n * result1[i, j]; } } Console.WriteLine("矩阵求逆后的结果为:"); OutPrint(result2, a, a); } } class Program { static void Main(string[] args) { double[,] arr1; double[,] arr2; JuZhen p = new JuZhen(); //申明一个JuZhen类的一个实例 JuZhen p1 = new JuZhen(); //给出即将输入的矩阵实例 int x1, y1; JuZhen p2 = new JuZhen(); int x2, y2; Console.WriteLine("请输入第一个矩阵的行"); //第一个矩阵的输入和输出 x1 = int.Parse(Console.ReadLine()); Console.WriteLine("请输入第一个矩阵的列"); y1 = int.Parse(Console.ReadLine()); Console.WriteLine("矩阵的行数为:{0},矩阵的列数为:{1}", x1, y1); arr1 = new double[x1, y1]; arr1 = p1.InputArr(x1, y1); Console.WriteLine("选择1继续输入第二个矩阵,您将做***加法+++乘法****\n按其他数字做矩阵的***求逆+++转置***求行列式的值**选项"); int n; //对矩阵运算的第一次选择 n = int.Parse(Console.ReadLine()); if (n == 1) { Console.WriteLine("请输入第二个矩阵的行和列"); //第二个矩阵的输入和输出 x2 = int.Parse(Console.ReadLine()); y2 = int.Parse(Console.ReadLine()); Console.WriteLine("矩阵的行数为:{0},矩阵的列数为:{1}", x2, y2); arr2 = new double[x2, y2]; arr2 = p2.InputArr(x2, y2); Console.WriteLine("输入1做+++加法+++.输入2做***乘法***"); int m; m = int.Parse(Console.ReadLine()); switch (m) { case 1: p.Add(arr1, x1, y1, arr2, x2, y2); break; case 2: p.Time(arr1, x1, y1, arr2, x2, y2); break; default: break; } } else { int a; Console.WriteLine("输入1做+++求逆法+++.输入2做+++转置***输入3做求行列式的值**"); a = int.Parse(Console.ReadLine()); switch (a) { case 1: p.QiuNi(arr1, x1, y1); break; case 2: p.ZhuanZhi(arr1, x1, y1); break; case 3: if (x1 == y1) Console.WriteLine("行列式的值为:{0}", p.QiuZhi(arr1, x1)); else Console.WriteLine("这不是行列式,因为行与列不相等,请重新启动程序"); break; default: break; } } Console.WriteLine("按回车键退出"); Console.Read(); } } }
/
本文档为【C#行列式】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索