C# 实数矩阵行列式计算
2016-10-25 00:00
99 查看
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MatrixHandler { class Num { int numerator = 0; int denominator = 1; public static Num operator *(Num n1, Num n2) { return new Num(n1.Numerator * n2.Numerator, n1.Denominator * n2.Denominator); } public static Num operator /(Num n1, Num n2) { if (n1.Numerator < 0 && n2.Numerator < 0) return new Num(-n1.Numerator * n2.Denominator, n1.Denominator * -n2.Numerator); return new Num(n1.Numerator * n2.Denominator, n1.Denominator * n2.Numerator); } public static Num operator +(Num n1, Num n2) { return new Num(n1.Numerator * n2.Denominator + n2.Numerator * n1.Denominator, n1.Denominator * n2.Denominator); } public static Num operator -(Num n1, Num n2) { return new Num(n1.Numerator * n2.Denominator - n2.Numerator * n1.Denominator, n1.Denominator * n2.Denominator); } public static Num operator -(Num n) { return new Num(-n.Numerator, n.Denominator); } public Num getCopy() { return new Num(Numerator, Denominator); } public int Numerator { get { return numerator; } set { numerator = value; } } public int Denominator { get { return denominator; } set { denominator = value; } } public Num(int numerator, int denominator) { this.Numerator = numerator; this.Denominator = denominator; reduce(); } public Num() { } public Num(string s) { if (s.IndexOf('.') != -1) { string[] str = s.Split('.'); Numerator = Convert.ToInt32(str[0] + str[1]); Denominator = tenPow(str[1].Length); } else if (s.IndexOf('/') != -1) { string[] str = s.Split('/'); Numerator = Convert.ToInt32(str[0]); Denominator = Convert.ToInt32(str[1]); } else { Numerator = Convert.ToInt32(s); } reduce(); } public Num(int val) { Denominator = 1; Numerator = val; } public override string ToString() { return denominator == 1 ? Numerator + "" : Numerator + "/" + Denominator; } public int gcd(int a, int b) { int m = Math.Abs(a); int n = Math.Abs(b); int t; while (m != 0) { t = n % m; n = m; m = t; } return n; } private void reduce() { int t = gcd(Numerator, Denominator); Denominator /= t; Numerator /= t; if (Numerator == 0) Denominator = 1; if (Numerator > 0 != Denominator > 0) { Numerator = -Math.Abs(Numerator); Denominator = Math.Abs(Denominator); } } private int tenPow(int n) { int res = 1; while (n != 0) { res *= 10; --n; } return res; } } }
矩阵类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MatrixHandler { class Matrix { Num[,] nums; int n; internal Num[,] Nums { get { return nums; } set { nums = value; } } public int N { get { return n; } set { n = value; } } public Matrix(Num[,] nums,int n) { this.Nums = nums; this.N = n; } 3ff0 //余子式 public Matrix getM(int x,int y) { if (N < 2) return null; Num[,] temp = new Num[N - 1, N - 1]; for(int i = 0; i < N; ++i) { for(int j = 0; j < N; ++j) { if (i < x && j < y) { temp[i, j] = Nums[i, j].getCopy(); } if(i<x && j > y) { temp[i, j-1] = Nums[i, j].getCopy(); } if(i>x && j < y) { temp[i - 1, j] = Nums[i, j].getCopy(); } if(i>x && j > y) { temp[i - 1, j - 1] = Nums[i, j].getCopy(); } } } return new Matrix(temp, N - 1); } public Num getVal() { if (N == 1) return Nums[0, 0]; if (N == 2) return Nums[0, 0] * Nums[1, 1] - Nums[0, 1] * Nums[1, 0]; Num res = new Num(0); int t = 1; for(int i = 0; i < N; ++i) { res = res + nums[0,i] * (new Num(t)) * (getM(0, i).getVal().getCopy()); t *= -1; } return res; } public Matrix getInverse() { Num val = getVal().getCopy(); Num[,] temp = new Num[N, N]; Num[,] com = getCompany().Nums; for (int i = 0; i < N; ++i) { for(int j = 0; j < N; ++j) { temp[i,j] = (com[i, j]/val).getCopy(); } } Matrix res = new Matrix(temp,n); return res; } public Matrix getCompany() { Num[,] temp = new Num[N,N]; for(int i = 0; i < N; ++i) { for(int j = 0; j < N; ++j) { int t = (i + j) % 2 == 0 ? 1 : -1; temp[j, i] = ( this.getM(i,j).getVal() * (new Num(t))).getCopy(); } } Matrix res=new Matrix(temp,N); return res; } public override string ToString() { string res=""; int x=0, y=0; for (x = 0; x < N; ++x) { for (y = 0; y < N; ++y) { res += Nums[x, y]; if (y == N - 1) res += "\n"; else res += "\t"; } } return res; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MatrixHandler { class Program { delegate void Handler(); static void Main(string[] args) { while (true) { mainView(); } } public static void mainView(){ Console.WriteLine("实矩阵行列式计算,请选择功能:\n1,行列式求值\t2,矩阵求逆\t3,矩阵求伴随"); try { int flag = Convert.ToInt32(Console.ReadLine()); Handler[] h = new Handler[3]; h[0] = new Handler(getVal); h[1] = new Handler(getInverse); h[2] = new Handler(getCompany); Console.WriteLine("请输入矩阵"); h[flag - 1].Invoke(); } catch (Exception) { Console.WriteLine("格式错误!数字之间只能输入一个空格!且本程序只能处理方阵."); } } public static void getVal() { Matrix m = getMatrix(); Console.WriteLine("输入的行列式为:\n"+m+"该行列式的值为:"+m.getVal()); } public static void getInverse() { Matrix m = getMatrix(); if (m.getVal().Numerator == 0) Console.WriteLine("该矩阵不可逆!"); else Console.WriteLine("输入的矩阵为:\n" + m + "该矩阵的逆矩阵为:\n" + m.getInverse()); } public static void getCompany() { Matrix m = getMatrix(); Console.WriteLine("输入的矩阵为:\n" + m + "该矩阵的伴随矩阵为:\n" + m.getCompany()); } public static Matrix getMatrix() { string s = Console.ReadLine(); string[] row = s.Split(' '); int n = row.Length; Num[,] nums = new Num[n,n]; for (int i = 0; i < n; ++i) nums[0,i] = new Num(row[i]).getCopy(); for(int i = 1; i < n; ++i) { string st = Console.ReadLine(); string[] rowt = st.Split(' '); for(int j=0;j<n;++j) nums[i, j] = new Num(rowt[j]).getCopy(); } return new Matrix(nums, n); } } }
相关文章推荐
- C#中计算表达式的值
- 由SAT问题展开说(2)[演化计算c#实现上]
- C#实现的根据年月日计算星期几的函数
- C#计算汉语拼音
- 计算圆周率的C#程序
- c#计算汉语拼音码
- 如何在C#里面象js一样可以直接计算字符串的值
- 发掘 C# 特性赋予科学计算项目以威力
- C#实现的根据年月日计算星期几的函数
- 由SAT问题展开说(2)[演化计算c#实现下]
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java) (转载)
- 字符串表达式计算C#程序设计
- 如何在C#里面象js一样可以直接计算字符串的值
- C#实现的根据年月日计算星期几的函数
- C#数值计算之模拟退火法简介(一)
- 如何在C#里面象js一样可以直接计算字符串的值
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- C#实现的根据年月日计算星期几的函数
- c#与科学计算之一:发掘 C# 特性赋予科学计算项目以威力(转贴)
- C#实现的根据年月日计算星期几的函数