private void button3_Click(object sender, EventArgs e) { double[] arrDataA = new double[2] { 3, 4 }; double[,] arrDataB = new double[2,2]{ {1,2}, {2,3} }; Matrix a = new Matrix(arrDataA); Matrix b = new Matrix(arrDataA); Matrix c; c = a + b; Console.WriteLine("A + B :" + c.ToString()); c = a - b; Console.WriteLine("A - B :" + c.ToString()); Console.WriteLine("A == B :" + (a == b).ToString()); b = new Matrix(arrDataB); Console.WriteLine("A == B :" + (a == b).ToString()); c = a * b; Console.WriteLine("A * B :" + c.ToString()); }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ProgressTest { /// <summary> /// 矩陣類 /// </summary> /// <remarks> /// 孫繼磊,2010-10-18 /// sun.j.l.studio@gmail.com /// </remarks> public sealed class Matrix { int row, column; //矩陣的行列數 double[,] data; //矩陣的數據 #region 構造函數 public Matrix(int rowNum, int columnNum) { row = rowNum; column = columnNum; data = new double[row, column]; } public Matrix(double[,] members) { row = members.GetUpperBound(0) + 1; column = members.GetUpperBound(1) + 1; data = new double[row, column]; Array.Copy(members, data, row * column); } public Matrix(double[] vector) { row = 1; column = vector.GetUpperBound(0) + 1; data = new double[1, column]; for (int i = 0; i < vector.Length; i++) { data[0, i] = vector[i]; } } #endregion #region 屬性和索引器 public int rowNum { get { return row; } } public int columnNum { get { return column; } } public double this[int r, int c] { get { return data[r, c]; } set { data[r, c] = value; } } #endregion public override string ToString() { string strRet = ""; for(int i=0;i<row;i++) for (int j = 0; j < column; j++) { strRet += data[i,j] + " , "; } return strRet; } #region 轉置 /// <summary> /// 將矩陣轉置,得到一個新矩陣(此操作不影響原矩陣) /// </summary> /// <param name="input">要轉置的矩陣</param> /// <returns>原矩陣經過轉置得到的新矩陣</returns> public static Matrix transpose(Matrix input) { double[,] inverseMatrix = new double[input.column, input.row]; for (int r = 0; r < input.row; r++) for (int c = 0; c < input.column; c++) inverseMatrix[c, r] = input[r, c]; return new Matrix(inverseMatrix); } #endregion #region 得到行向量或者列向量 public Matrix getRow(int r) { if (r > row || r <= 0) throw new Exception("沒有這一行。"); double[] a = new double[column]; Array.Copy(data, column * (row - 1), a, 0, column); Matrix m = new Matrix(a); return m; } public Matrix getColumn(int c) { if (c > column || c < 0) throw new Exception("沒有這一列。"); double[,] a = new double[row, 1]; for (int i = 0; i < row; i++) a[i, 0] = data[i, c]; return new Matrix(a); } #endregion #region 操作符重載 + - * / == != public static Matrix operator +(Matrix a, Matrix b) { if (a.row != b.row || a.column != b.column) throw new Exception("矩陣維數不匹配。"); Matrix result = new Matrix(a.row, a.column); for (int i = 0; i < a.row; i++) for (int j = 0; j < a.column; j++) result[i, j] = a[i, j] + b[i, j]; return result; } public static Matrix operator -(Matrix a, Matrix b) { return a + b * (-1); } public static Matrix operator *(Matrix matrix, double factor) { Matrix result = new Matrix(matrix.row, matrix.column); for (int i = 0; i < matrix.row; i++) for (int j = 0; j < matrix.column; j++) matrix[i, j] = matrix[i, j] * factor; return matrix; } public static Matrix operator *(double factor, Matrix matrix) { return matrix * factor; } //a 行元素 * b 列元素 //a 列數 == b行數 public static Matrix operator *(Matrix a, Matrix b) { if (a.column != b.row) throw new Exception("矩陣維數不匹配。"); Matrix result = new Matrix(a.row, b.column); for (int i = 0; i < a.row; i++) for (int j = 0; j < b.column; j++) for (int k = 0; k < a.column; k++) result[i, j] += a[i, k] * b[k, j]; return result; } public static bool operator ==(Matrix a, Matrix b) { if (object.Equals(a, b)) return true; if (object.Equals(null, b)) return a.Equals(b); return b.Equals(a); } public static bool operator !=(Matrix a, Matrix b) { return !(a == b); } public override bool Equals(object obj) { if (obj == null) return false; if (!(obj is Matrix)) return false; Matrix t = obj as Matrix; if (row != t.row || column != t.column) return false; return this.Equals(t, 10); } /// <summary> /// 按照給定的精度比較兩個矩陣是否相等 /// </summary> /// <param name="matrix">要比較的另外一個矩陣</param> /// <param name="precision">比較精度(小數位)</param> /// <returns>是否相等</returns> public bool Equals(Matrix matrix, int precision) { if (precision < 0) throw new Exception("小數位不能是負數"); double test = Math.Pow(10.0, -precision); if (test < double.Epsilon) throw new Exception("所要求的精度太高,不被支持。"); for (int r = 0; r < this.row; r++) for (int c = 0; c < this.column; c++) if (Math.Abs(this[r, c] - matrix[r, c]) >= test) return false; return true; } #endregion } }
