Advertisement
maxrusmos

Untitled

Apr 11th, 2020
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.76 KB | None | 0 0
  1. using CExeption;
  2. using System;
  3. using System.Collections;
  4. using System.Text;
  5.  
  6. namespace MatrixOp {
  7. public sealed class Matrix : IEnumerable, ICloneable, IComparable, IComparable<Matrix> {
  8. private double[,] mass;
  9.  
  10. public int CompareTo(Matrix A) {
  11. var ca1 = DeterminantMatrix(this);
  12. var ca2 = DeterminantMatrix(A);
  13. if (ca1 > ca2) {
  14. return 1;
  15. } else if (ca1 < ca2) {
  16. return -1;
  17. } else {
  18. return 0;
  19. }
  20. }
  21.  
  22. public int CompareTo(object obj) {
  23. if (!(obj is Matrix)) {
  24. throw new ArgumentException("Не могу сравнить значения", nameof(obj));
  25. }
  26. if (obj is null) {
  27. throw new ArgumentException("NULL", nameof(obj));
  28. }
  29. return CompareTo((Matrix)obj);
  30. }
  31.  
  32. public IEnumerator GetEnumerator() {
  33. return mass.GetEnumerator();
  34. }
  35.  
  36. public object Clone() {
  37. double[,] newMass = new double[mass.Length, mass.Length];
  38. for (int i = 0; i < N; i++) {
  39. for (int j = 0; j < N; i++) {
  40. newMass[i, j] = mass[i, j];
  41. }
  42. }
  43. return newMass;
  44. }
  45.  
  46. private const double EPS = 1E-15;
  47.  
  48. public Matrix() { }
  49.  
  50. public int N =>
  51. mass.GetLength(0);
  52.  
  53. public Matrix(int n) {
  54. mass = new double[n, n];
  55. }
  56.  
  57. public Matrix(int n, int lowerBorder, int upperBorder) {
  58. Random r = new Random();
  59. mass = new double[n, n];
  60. for (int i = 0; i < n; i++) {
  61. for (int j = 0; j < n; j++) {
  62. mass[i, j] = r.Next(lowerBorder, upperBorder);
  63. }
  64. }
  65. }
  66.  
  67. public Matrix(int n, params int[] elems) {
  68. mass = new double[n, n];
  69. for (int i = 0; i < elems.Length; i++) {
  70. mass[i / n, i % n] = elems[i];
  71. }
  72. }
  73.  
  74. public double this[int i, int j] {
  75. get {
  76. return mass[i, j];
  77. }
  78. set {
  79. mass[i, j] = value;
  80. }
  81. }
  82.  
  83. //ввод матрицы
  84. public void WriteMatrix() {
  85. for (int i = 0; i < N; i++) {
  86. for (int j = 0; j < N; j++) {
  87. Console.Write("Введите элемент матрицы " + (i + 1) + " : " + (j + 1) + ": ");
  88. var matrixElem = Console.ReadLine();
  89. if (!double.TryParse(matrixElem, out double number)) {
  90. Console.ForegroundColor = ConsoleColor.Red;
  91. throw new CustomException("Элемент матрицы не является числом" + Environment.NewLine);
  92. }
  93. mass[i, j] = Convert.ToDouble(matrixElem);
  94. }
  95. }
  96. }
  97.  
  98. //вывод матрицы
  99. public override string ToString() {
  100. StringBuilder strMatrix = new StringBuilder();
  101. for (int i = 0; i < N; i++) {
  102. for (int j = 0; j < N; j++) {
  103. strMatrix.Append(Math.Round(mass[i, j], 1).ToString() + "\t");
  104. }
  105. strMatrix.Append(Environment.NewLine);
  106. }
  107. return strMatrix.ToString();
  108. }
  109.  
  110. // Умножение матрицы А на число
  111. public static Matrix CompositionWhithNum(Matrix a, double num) {
  112. Matrix resMass = new Matrix(a.N);
  113. for (int i = 0; i < a.N; i++) {
  114. for (int j = 0; j < a.N; j++) {
  115. resMass[i, j] = a[i, j] * num;
  116. }
  117. }
  118. return resMass;
  119. }
  120.  
  121. public static Matrix operator *(Matrix a, double num) {
  122. return CompositionWhithNum(a, num);
  123. }
  124.  
  125. // Умножение матрицы А на матрицу B
  126. public static Matrix CompositionMatrix(Matrix a, Matrix b) {
  127. if (a.N != b.N) {
  128. throw new CustomException($"Эти матрицы нельзя перемножить{Environment.NewLine}");
  129. }
  130. Matrix resMass = new Matrix(a.N);
  131. for (int i = 0; i < a.N; i++)
  132. for (int j = 0; j < b.N; j++)
  133. for (int k = 0; k < b.N; k++)
  134. resMass[i, j] += a[i, k] * b[k, j];
  135.  
  136. return resMass;
  137. }
  138.  
  139. public static Matrix operator *(Matrix a, Matrix b) {
  140. return CompositionMatrix(a, b);
  141. }
  142.  
  143. //возведение матрицы в степень
  144. public static Matrix MatrixPow(Matrix A, int pow) {
  145. var resultMatrix = A;
  146. for (int i = 0; i < pow - 1; i++) {
  147. resultMatrix *= A;
  148. }
  149. return resultMatrix;
  150. }
  151.  
  152. //деление матрицы A на матрицу B
  153. public static Matrix DivisionMatrix(Matrix a, Matrix b) {
  154. return Matrix.CompositionMatrix(a, Matrix.ReverseMatrix(b));
  155. }
  156.  
  157. public static Matrix operator /(Matrix a, Matrix b) {
  158. return DivisionMatrix(a, b);
  159. }
  160.  
  161. // Сумма матриц
  162. public static Matrix SumMatrix(Matrix a, Matrix b) {
  163. if (a.N != b.N) {
  164. throw new CustomException("Размерности матриц не совпадают" + Environment.NewLine);
  165. }
  166. Matrix resMass = new Matrix(a.N);
  167. for (int i = 0; i < a.N; i++) {
  168. for (int j = 0; j < b.N; j++) {
  169. resMass[i, j] = a[i, j] + b[i, j];
  170. }
  171. }
  172. return resMass;
  173. }
  174.  
  175. public static Matrix operator +(Matrix a, Matrix b) {
  176. return SumMatrix(a, b);
  177. }
  178.  
  179. // Сумма матриц
  180. public static Matrix DifferenceMatrix(Matrix a, Matrix b) {
  181. if (a.N != b.N) {
  182. throw new CustomException("Размерности матриц не совпадают" + Environment.NewLine);
  183. }
  184. Matrix resMass = new Matrix(a.N);
  185. for (int i = 0; i < a.N; i++) {
  186. for (int j = 0; j < b.N; j++) {
  187. resMass[i, j] = a[i, j] - b[i, j];
  188. }
  189. }
  190. return resMass;
  191. }
  192.  
  193. public static Matrix operator -(Matrix a, Matrix b) {
  194. return DifferenceMatrix(a, b);
  195. }
  196.  
  197. //транспонирование
  198. public static Matrix TranspositionMatrix(Matrix a) {
  199. Matrix resMass = new Matrix(a.N);
  200. for (int i = 0; i < a.N; i++) {
  201. for (int j = 0; j < a.N; j++) {
  202. resMass[i, j] = a[j, i];
  203. }
  204. }
  205. return resMass;
  206. }
  207.  
  208. //определитель
  209. public static double DeterminantMatrix(Matrix detMatrix) {
  210. var det = 1.0;
  211.  
  212. double[][] a = new double[detMatrix.N][];
  213. double[][] b = new double[1][];
  214. b[0] = new double[detMatrix.N];
  215.  
  216. for (int i = 0; i < detMatrix.N; i++) {
  217. a[i] = new double[detMatrix.N];
  218. for (int j = 0; j < detMatrix.N; j++) {
  219. a[i][j] = detMatrix[i, j];
  220. }
  221. }
  222.  
  223. for (int i = 0; i < detMatrix.N; ++i) {
  224. var k = i;
  225. for (int j = i + 1; j < detMatrix.N; ++j) {
  226. if (Math.Abs(a[j][i]) > Math.Abs(a[k][i]))
  227. k = j;
  228. }
  229.  
  230. if (Math.Abs(a[k] [i]) < EPS) {
  231. det = 0.0;
  232. break;
  233. }
  234.  
  235. b[0] = a[i];
  236. a[i] = a[k];
  237. a[k] = b[0];
  238.  
  239. if (i != k) {
  240. det = -det;
  241. }
  242. det *= a[i][i];
  243. for (int j = i + 1; j < detMatrix.N; ++j) {
  244. a[i][j] /= a[i][i];
  245. }
  246.  
  247. for (int j = 0; j < detMatrix.N; ++j) {
  248. if ((j != i) && (Math.Abs(a[j][i]) > EPS)) {
  249. for (k = i + 1; k < detMatrix.N; ++k) {
  250. a[j][k] -= a[i][k] * a[j][i];
  251. }
  252. }
  253. }
  254. }
  255. return det;
  256. }
  257.  
  258. //обратная матрица
  259. public static Matrix ReverseMatrix(Matrix a) {
  260. Matrix resMass = new Matrix(a.N);
  261. Matrix AlgebraicAdditionsMatrix = new Matrix(a.N);
  262. if (Math.Abs(DeterminantMatrix(a)) < EPS) {
  263. throw new CustomException("Определитель матрицы равен 0. Матрицa вырожденная" + Environment.NewLine);
  264. }
  265. for (int i = 0; i < a.N; i++) {
  266. for (int j = 0; j < a.N; j++) {
  267. AlgebraicAdditionsMatrix[i, j] = Math.Pow(-1, i + j) * DeterminantMatrix(DeleteRowCol(i, j, a));
  268. }
  269. }
  270. AlgebraicAdditionsMatrix = TranspositionMatrix(AlgebraicAdditionsMatrix);
  271. resMass = CompositionWhithNum(AlgebraicAdditionsMatrix, 1 / DeterminantMatrix(a));
  272. return resMass;
  273. }
  274.  
  275. //миноры
  276. public static Matrix DeleteRowCol(int row, int col, Matrix a) {
  277. Matrix resMass = new Matrix(a.N - 1);
  278. for (int i = 0; i < a.N-1; i++) {
  279. if (i < row) {
  280. for (int j = 0; j < a.N - 1; j++) {
  281. if (j < col) {
  282. resMass[i, j] = a[i, j];
  283. } else {
  284. resMass[i, j] = a[i, j + 1];
  285. }
  286. }
  287. } else {
  288. for (int j = 0; j < a.N - 1; j++) {
  289. if (j < col) {
  290. resMass[i, j] = a[i + 1, j];
  291. } else {
  292. resMass[i, j] = a[i + 1, j + 1];
  293. }
  294. }
  295. }
  296. }
  297. return resMass;
  298. }
  299. }
  300. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement