using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { class Matrix { public Matrix (int Linescount, int ColumsCount) { Lc = Linescount; Cc = ColumsCount; } public double[,] Mbody = new double[3, 3]; public int Lc {set; get;} public int Cc {set; get;} static public Matrix MI(int Lc, int Cc) { Matrix E = new Matrix(Lc, Cc); for (int i = 0; i < Lc; i++) for (int j = 0; j < Cc; j++) if (i == j) E.Mbody[i, j] = 1; return E; } static public Single Det(Matrix m) { if (m.Cc != m.Lc) { MessageBox.Show("ups!"); return 0.0f; } else { if (m.Cc == 1) return (float)m.Mbody[0, 0]; else { if (m.Cc == 2) return (float)(m.Mbody[0, 0] * m.Mbody[1, 1] - m.Mbody[0, 1] * m.Mbody[1, 0]); else { float DetM = (float) (m.Mbody[0, 0] * m.Mbody[1, 1] * m.Mbody[2, 2]- m.Mbody[0, 0] * m.Mbody[1, 2] * m.Mbody[2, 1] - m.Mbody[0, 1] * m.Mbody[1, 0] * m.Mbody[2, 2] + m.Mbody[0, 1] * m.Mbody[1, 2] * m.Mbody[2, 0] + m.Mbody[0, 2] * m.Mbody[1, 0] * m.Mbody[2, 1] - m.Mbody[0, 2] * m.Mbody[1, 1] * m.Mbody[2, 0]); return DetM; } } } } static public Matrix T(Matrix m) { Matrix Temp = new Matrix(m.Cc, m.Lc); for (int i = 0; i < Temp.Lc; i++) for (int j = 0; j < Temp.Cc; j++) Temp.Mbody[i, j] = m.Mbody[j, i]; return Temp; } static public double ToDouble(Matrix m) { return m.Mbody[0, 0]; } static public Matrix operator /(Matrix m1, Matrix m2) { //найти обратную m2 и на нее умножить //находим обратную методом Гауссовских перестановок if (Det(m2) != 0) { Matrix C = MI(m2.Lc, m2.Cc); Matrix I = MI(m2.Lc, m2.Cc); Matrix A = m2; for (int i = 0; i < m2.Cc; i++) { C = MI(m2.Lc, m2.Cc); for (int m = 0; m < m2.Cc; m++) { if (m != i) { C.Mbody[m, i] = -A.Mbody[m, i] / A.Mbody[i, i]; } else { C.Mbody[m, i] = 1 / A.Mbody[i, i]; } } A = C * A; I = C * I; } return (m1 * I); } else { MessageBox.Show("ups!"); return null; } } static public Matrix operator + (Matrix m1, Matrix m2) { Matrix Summ = new Matrix(m1.Lc, m1.Cc); if ((m1.Cc == m2.Cc)&&(m2.Lc == m1.Lc)) { for (int i = 0; i < m1.Lc; i++) for (int j = 0; j < m1.Cc; j++) Summ.Mbody[i, j] = m1.Mbody[i, j] + m2.Mbody[i, j]; return Summ; } else { MessageBox.Show("ups!"); return null; } } static public Matrix operator -(Matrix m1, Matrix m2) { Matrix Summ = new Matrix(m1.Lc, m1.Cc); if ((m1.Cc == m2.Cc) && (m2.Lc == m1.Lc)) { for (int i = 0; i < m1.Lc; i++) for (int j = 0; j < m1.Cc; j++) Summ.Mbody[i, j] = m1.Mbody[i, j] - m2.Mbody[i, j]; return Summ; } else { MessageBox.Show("ups!"); return null; } } static public Matrix operator * (Matrix m1, Matrix m2) { Matrix M = new Matrix(m1.Lc, m2.Cc); if (m1.Cc == m2.Lc) { for (int i = 0; i < m1.Lc; i++) for (int j = 0; j < m2.Cc; j++) for (int k = 0; k < m1.Cc; k++) M.Mbody[i, j] += (m1.Mbody[i, k] * m2.Mbody[k, j]); return M; } else { MessageBox.Show("ups!"); return null; } } static public Matrix operator *(Matrix m1, double n) { Matrix m = new Matrix(m1.Lc, m1.Cc); for (int i = 0; i < m1.Lc; i++) for (int j = 0; j < m1.Cc; j++) m.Mbody[i, j] = m1.Mbody[i,j]; for (int i = 0; i < m1.Lc; i++) for (int j = 0; j < m1.Cc; j++) m.Mbody[i, j] *= n; return m; } } }