2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > c#矩阵类的实现包括伴随矩阵求逆 初等变换求逆 矩阵的加 乘法转置等功能

c#矩阵类的实现包括伴随矩阵求逆 初等变换求逆 矩阵的加 乘法转置等功能

时间:2018-12-05 22:47:40

相关推荐

c#矩阵类的实现包括伴随矩阵求逆 初等变换求逆 矩阵的加 乘法转置等功能

c#好像没有自带的矩阵类,而很多的算法中需要用到矩阵类,今天分享一个c#实现的矩阵类,包含了矩阵的加,乘法,转置求逆(伴随矩阵求逆:当行列式的值特别大或特别小的时候不适用。初等变换:求逆效率要高,不受行列式值的影响)。求行列式的值等功能具体代码如下:

/// <summary>/// 矩阵类/// </summary>public class Mat{double[,] Array;//存储矩阵中的元素public double[,] Element => Array;//获取矩阵中的元素public int Rows => Element.GetLength(0);//行public int Cols => Element.GetLength(1);//列public double this[int i,int j]//索引器{get{return Array[i, j];}set{Array[i, j] = value;}}/// <summary>/// 构造函数/// </summary>/// <param name="r">矩阵的行</param>/// <param name="c">矩阵的列</param>/// <param name="n">矩阵的元素</param>public Mat(int r,int c,params double [] n){Array = new double[r, c];for (int i = 0; i < Rows; i++){for (int j = 0; j < Cols; j++){Array[i, j] = n[i * Cols + j];}}}/// <summary>/// 构造r行n列的空矩阵/// </summary>/// <param name="r">行</param>/// <param name="c">列</param>public Mat(int r,int c){Array = new double[r, c];}/// <summary>/// 将一个二位数组构造为矩阵/// </summary>/// <param name="array"></param>public Mat(double [,] array){this.Array = array;}/// <summary>/// 将n个行列相同的矩阵向下累加/// </summary>/// <param name="mats"></param>public Mat(params Mat []mats){this.Array = new double[mats.Length * mats[0].Rows, mats[0].Cols];for (int n = 0; n < mats.Length; n++){for (int i = 0; i < mats[0].Rows; i++){for (int j = 0; j < mats[0].Cols; j++){Array[n * mats[0].Rows + i, j] = mats[n][i, j];}}}}/// <summary>/// 矩阵的加法/// </summary>/// <param name="m1">左矩阵</param>/// <param name="m2">右矩阵</param>/// <returns></returns>public static Mat operator +(Mat m1, Mat m2){Mat res = new Mat(m1.Rows, m1.Cols);for (int i = 0; i < m1.Rows; i++){for (int j = 0; j < m1.Cols; j++){res[i, j] = m1[i, j] + m2[i, j];}}return res;}/// <summary>/// 矩阵的乘法/// </summary>/// <param name="m1">左矩阵</param>/// <param name="m2">右矩阵</param>/// <returns></returns>public static Mat operator *(Mat m1, Mat m2){Mat res = new Mat(m1.Rows, m2.Cols);for (int i = 0; i < m1.Rows; i++){for (int k = 0; k < m2.Cols; k++){double sum = 0;for (int j = 0; j < m1.Cols; j++){sum += m1[i, j] * m2[j, k];}res[i, k] = sum;}}return res;}/// <summary>/// 矩阵于数相乘/// </summary>/// <param name="n"></param>/// <returns></returns>public Mat Mul(double n){Mat res = new Mat(Rows, Cols);for (int i = 0; i < Rows; i++){for (int j = 0; j < Cols; j++){res[i, j] = n * Array[i, j];}}return res;}/// <summary>/// 行列式的值/// </summary>public double MatValue{get{if (Rows == 1){return Array[0,0];}else{double sum = 0;for (int i = 0; i < Cols; i++){sum += Array[0,i] * GetK(0, i) * Accompany(0, i).MatValue;}return sum;}}}/// <summary>/// 伴随矩阵求逆/// </summary>public Mat Inverser{get{double value = MatValue;Mat matrix = new Mat(Rows, Cols);for (int i = 0; i < Rows; i++){for (int j = 0; j < Cols; j++){matrix.Array[i, j] = (GetK(j, i) * Accompany(j, i).MatValue / value);}}return matrix;}}/// <summary>/// 矩阵的转置/// </summary>public Mat TransMat{get{Mat res = new Mat(Cols, Rows);for (int i = 0; i < Rows; i++){for (int j = 0; j < Cols; j++){res[j, i] = this[i, j];}}return res;}}/// <summary>/// 矩阵第r行第c列的的伴随矩阵/// </summary>/// <param name="r"></param>/// <param name="c"></param>/// <returns></returns>public Mat Accompany(int r, int c){Mat res = new Mat(Rows - 1, Cols - 1);for (int i = 0; i < res.Rows; i++){for (int j = 0; j < res.Cols; j++){res[i, j] = this[i < r ? i : i + 1, j < c ? j : j + 1];}}return res;}/// <summary>/// 初等变换求逆/// </summary>public Mat Inverser2{get{int m = Rows;int n = Cols;double[,] array = new double[2 * m + 1, 2 * n + 1];for (int k = 0; k < 2 * m + 1; k++) //初始化数组{for (int t = 0; t < 2 * n + 1; t++){array[k, t] = 0.00000000;}}for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){array[i, j] = Array[i, j];}}for (int k = 0; k < m; k++){for (int t = n; t <= 2 * n; t++){if ((t - k) == m){array[k, t] = 1.0;}else{array[k, t] = 0;}}}//得到逆矩阵for (int k = 0; k < m; k++){if (array[k, k] != 1){double bs = array[k, k];array[k, k] = 1;for (int p = k + 1; p < 2 * n; p++){array[k, p] /= bs;}}for (int q = 0; q < m; q++){if (q != k){double bs = array[q, k];for (int p = 0; p < 2 * n; p++){array[q, p] -= bs * array[k, p];}}else{continue;}}}double[,] NI = new double[m, n];for (int x = 0; x < m; x++){for (int y = n; y < 2 * n; y++){NI[x, y - n] = array[x, y];}}return new Mat(NI);}}private int GetK(int r,int c){return (int)Math.Pow(-1, r + c);}/// <summary>/// 矩阵的ToString方法/// </summary>/// <returns></returns>public override string ToString(){string str = "";for (int i = 0; i < Rows; i++){for (int j = 0; j < Cols; j++){str += Element[i, j].ToString("6").PadLeft(10) ;}str += "\r\n" + "\r\n";}return str;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。