using System; namespace Science.Mathematics.VectorCalculus { public class Matrix { protected double[,] el; protected int m, n; public int RowDimension { get { return m; } } public int ColumnDimension { get { return n; } } public Matrix(double[,] x) { m = x.GetLength(0); n = x.GetLength(1); el = new double[m, n]; for (int k = 0; k < m; k++) for (int kk = 0; kk < n; kk++) el[k, kk] = x[k, kk]; } public Matrix(int rowDimension, int columnDimension) { m = rowDimension; n = columnDimension; el = new double[m, n]; } public double this[int whereRow, int whereColumn] { get { return el[whereRow, whereColumn]; } set { el[whereRow, whereColumn] = value; } } public Matrix Transpose { get { Matrix ma = new Matrix(n,m); for (int k = 0; k < m; k++) for (int kk = 0; kk < n; kk++) ma[kk,k] = el[k, kk]; return ma; } } public static Matrix operator *(double a, Matrix c) { Matrix b = new Matrix(c.RowDimension, c.ColumnDimension); for (int k = 0; k < c.RowDimension; k++) for (int j = 0; j < c.ColumnDimension; j++) b[k,j] = a * c[k, j]; return b; } public static Matrix operator *(Matrix c, double a) { return a * c; } public static Matrix operator +(Matrix a, Matrix c) { Matrix b = new Matrix(a.RowDimension, a.ColumnDimension); for (int k = 0; k < a.RowDimension; k++) for (int j = 0; j < a.ColumnDimension; j++) b[k, j] = a[k, j] + c[k, j]; return b; } public static Matrix operator -(Matrix a, Matrix c) { Matrix b = new Matrix(a.RowDimension, a.ColumnDimension); for (int k = 0; k < a.RowDimension; k++) for (int j = 0; j < a.ColumnDimension; j++) b[k, j] = a[k, j] - c[k, j]; return b; } public static Matrix operator -(Matrix c) { Matrix b = new Matrix(c.RowDimension, c.ColumnDimension); for (int k = 0; k < c.RowDimension; k++) for (int j = 0; j < c.ColumnDimension; j++) b[k, j] = - c[k, j]; return b; } public static Vector operator *(Matrix a, Vector c) { Vector b = new Vector(a.RowDimension); for (int k = 0; k < b.Dimension; k++) { double sum = 0.0; for (int s = 0; s < c.Dimension; s++) sum += a[k, s] * c[s]; b[k] = sum; } return b; } public static Vector operator *(Vector c, Matrix a) { Vector b = new Vector(a.ColumnDimension); for (int k = 0; k < b.Dimension; k++) { double sum = 0.0; for (int s = 0; s < c.Dimension; s++) sum += c[s] * a[s, k]; b[k] = sum; } return b; } public static Matrix operator *(Matrix a, Matrix c) { Matrix b = new Matrix(a.RowDimension, c.ColumnDimension); for (int k = 0; k < b.RowDimension; k++) for (int j = 0; j < b.ColumnDimension; j++) { double sum = 0.0; for (int s = 0; s < a.ColumnDimension; s++) sum += a[k, s] * c[s, j]; b[k, j] = sum; } return b; } public override string ToString() { string res = ""; for (int i = 0; i < this.RowDimension; i++) { for (int j = 0; j < this.ColumnDimension; j++) res += this[i, j].ToString() + " "; res += "\r\n"; } res += "\r\n"; return res; } } }