Реализовать класс для матриц. В этом классе реализовать интерфейс, содержащий методы для выполнения операций - C#
Формулировка задачи:
Реализовать класс для матриц. В этом классе реализовать интерфейс, содержащий методы для выполнения следующих операций:
- сложение
- умножение
- транспонирование.
Решение задачи: «Реализовать класс для матриц. В этом классе реализовать интерфейс, содержащий методы для выполнения операций»
textual
Листинг программы
class Program { /* * real (row x col) matrix */ public class RMatrix { private int nRows; private int nCols; private double[,] matrix; public RMatrix(int nRows, int nCols) { this.nRows = nRows; this.nCols = nCols; this.matrix = new double[nRows, nCols]; for (int i = 0; i < nRows; i++) { for (int j = 0; j < nCols; j++) { matrix[i, j] = 0.0; } } } public RMatrix(double[,] matrix) { this.nRows = matrix.GetLength(0); this.nCols = matrix.GetLength(1); this.matrix = matrix; } public RMatrix(RMatrix m) { nRows = m.GetnRows; nCols = m.GetnCols; matrix = m.matrix; } public RMatrix IdentityMatrix() { RMatrix m = new RMatrix(nRows, nCols); for (int i = 0; i < nRows; i++) { for (int j = 0; j < nCols; j++) { if (i == j) { m[i, j] = 1; } } } return m; } public double this[int m, int n] { get { if (m < 0 || m > nRows) { throw new Exception("m-th row is out of range!"); } if (n < 0 || n > nCols) { throw new Exception("n-th col is out of range!"); } return matrix[m, n]; } set { matrix[m, n] = value; } } public int GetnRows { get { return nRows; } } public int GetnCols { get { return nCols; } } public override string ToString() { string strMatrix = "("; for (int i = 0; i < nRows; i++) { string str = ""; for (int j = 0; j < nCols - 1; j++) { str += matrix[i, j].ToString() + ", "; } str += matrix[i, nCols - 1].ToString(); if (i != nRows - 1 && i == 0) strMatrix += str + "\n"; else if (i != nRows - 1 && i != 0) strMatrix += " " + str + "\n"; else strMatrix += " " + str + ")"; } return strMatrix; } public static bool operator ==(RMatrix m1, RMatrix m2) { return m1.Equals(m2); } public static bool operator !=(RMatrix m1, RMatrix m2) { return !m1.Equals(m2); } public static RMatrix operator +(RMatrix m) { return m; } public static RMatrix operator +(RMatrix m1, RMatrix m2) { RMatrix result = new RMatrix(m1.GetnRows, m1.GetnCols); for (int i = 0; i < m1.GetnRows; i++) { for (int j = 0; j < m1.GetnCols; j++) { result[i, j] = m1[i, j] + m2[i, j]; } } return result; } public static RMatrix operator -(RMatrix m) { for (int i = 0; i < m.GetnRows; i++) { for (int j = 0; j < m.GetnCols; j++) { m[i, j] = -m[i, j]; } } return m; } public static RMatrix operator -(RMatrix m1, RMatrix m2) { RMatrix result = new RMatrix(m1.GetnRows, m1.GetnCols); for (int i = 0; i < m1.GetnRows; i++) { for (int j = 0; j < m1.GetnCols; j++) { result[i, j] = m1[i, j] - m2[i, j]; } } return result; } public static RMatrix operator *(RMatrix m, double d) { RMatrix result = new RMatrix(m.GetnRows, m.GetnCols); for (int i = 0; i < m.GetnRows; i++) { for (int j = 0; j < m.GetnCols; j++) { result[i, j] = m[i, j] * d; } } return result; } public static RMatrix operator *(double d, RMatrix m) { RMatrix result = new RMatrix(m.GetnRows, m.GetnCols); for (int i = 0; i < m.GetnRows; i++) { for (int j = 0; j < m.GetnCols; j++) { result[i, j] = m[i, j] * d; } } return result; } public static RMatrix operator /(RMatrix m, double d) { RMatrix result = new RMatrix(m.GetnRows, m.GetnCols); for (int i = 0; i < m.GetnRows; i++) { for (int j = 0; j < m.GetnCols; j++) { result[i, j] = m[i, j] / d; } } return result; } public static RMatrix operator /(double d, RMatrix m) { RMatrix result = new RMatrix(m.GetnRows, m.GetnCols); for (int i = 0; i < m.GetnRows; i++) { for (int j = 0; j < m.GetnCols; j++) { result[i, j] = m[i, j] / d; } } return result; } public static RMatrix operator *(RMatrix m1, RMatrix m2) { if (m1.GetnCols != m2.GetnRows) { throw new Exception("The numbers of columns of the" + " first matrix must be equal to the number of " + " rows of the second matrix!"); } double tmp; RMatrix result = new RMatrix(m1.GetnRows, m2.GetnCols); for (int i = 0; i < m1.GetnRows; i++) { for (int j = 0; j < m2.GetnCols; j++) { tmp = result[i, j]; for (int k = 0; k < result.GetnRows; k++) { tmp += m1[i, k] * m2[k, j]; } result[i, j] = tmp; } } return result; } public RMatrix Transpose() { RMatrix m = new RMatrix(nCols, nRows); for (int i = 0; i < nRows; i++) { for (int j = 0; j < nCols; j++) { m[j, i] = matrix[i, j]; } } return m; } } static void Main(string[] args) { RMatrix m1 = new RMatrix(new double[3, 3] { {3.0, 2.0, 7.0}, {9.0, 3.0, 5.0}, {4.0, 1.0, 0.0}}); RMatrix m2 = new RMatrix(3, 3); m2[0, 0] = 23.0; m2[0, 1] = 6.0; m2[0, 2] = 8.0; m2[1, 0] = 2.0; m2[1, 1] = 55.0; m2[1, 2] = 39.0; m2[2, 0] = 1.0; m2[2, 1] = 4.0; m2[2, 2] = 10.0; Console.WriteLine("\nOriginal matrix: m1 = \n{0}", m1); Console.WriteLine("\nOriginal matrix: m2 = \n{0}", m2); Console.WriteLine("\nm1 + m2 = \n{0}", (m1 + m2)); Console.WriteLine("\nm1 - m2 = \n{0}", (m1 - m2)); Console.WriteLine("\nm1 * m2 = \n{0}", (m1 * m2)); Console.WriteLine("\nTranspose of m2 = \n{0}", m2.Transpose()); Console.ReadKey(); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д