Объектно-ориентированное программирование на С#. Андрианова А.А - 87 стр.

UptoLike

87
// размеры матриц должны совпадать
if (rows1 != rows2 || cols1 != cols2)
throw new Exception ("Матрицы таких размеров
складывать нельзя");
Matrix newM = new Matrix(rows1, cols1);
for (int i = 0; i < rows1; i++)
for (int j = 0; j < cols1; j++)
newM[j, i] = m1[i, j] + m2[i,j];
return newM;
}
// метод, перегружающий операцию траспонирование матрицы
static public Matrix operator !(Matrix m)
{
int rows = m.Rows, cols = m.Cols;
Matrix newM = new Matrix(cols, rows);
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
newM[j, i] = m[i, j];
return newM;
}
// операция перемножения двух матриц
static public Matrix operator *(Matrix m1, Matrix m2)
{
int rows1 = m1.Rows, cols1 = m1.Cols,
rows2 = m2.Rows, cols2=m2.Cols;
if (cols1 == rows2)
{
// создание матрицы-результата
Matrix newM = new Matrix(rows1, cols2);
// заполнение матрицы-результата
for (int i = 0; i < rows1; i++)
for (int j = 0; j < cols2; j++)
for (int k = 0; k < cols1; k++)
newM[i, j] += m1[i, k] * m2[k, j];
return newM;
}
else
{
// количество столбцов первой матрицы должно
// быть равно количеству строк второй матрицы
throw new Exception ("Матрицы таких размеров
перемножать нельзя");
}
}
// операция перемножения матрицы на число
static public Matrix operator *(Matrix m, double d)
{
// создание матрицы-результата
int rows = m.Rows, cols = m.Cols;
Matrix newM = new Matrix(rows, cols);
    // размеры матриц должны совпадать
    if (rows1 != rows2 || cols1 != cols2)
       throw new Exception ("Матрицы таких размеров
                             складывать нельзя");
    Matrix newM = new Matrix(rows1, cols1);
    for (int i = 0; i < rows1; i++)
       for (int j = 0; j < cols1; j++)
          newM[j, i] = m1[i, j] + m2[i,j];
    return newM;
}

// метод, перегружающий операцию траспонирование матрицы
static public Matrix operator !(Matrix m)
{
   int rows = m.Rows, cols = m.Cols;
   Matrix newM = new Matrix(cols, rows);
   for (int i = 0; i < rows; i++)
      for (int j = 0; j < cols; j++)
         newM[j, i] = m[i, j];
   return newM;
}

// операция перемножения двух матриц
static public Matrix operator *(Matrix m1, Matrix m2)
{
   int rows1 = m1.Rows, cols1 = m1.Cols,
       rows2 = m2.Rows, cols2=m2.Cols;
   if (cols1 == rows2)
   {
      // создание матрицы-результата
      Matrix newM = new Matrix(rows1, cols2);
      // заполнение матрицы-результата
      for (int i = 0; i < rows1; i++)
         for (int j = 0; j < cols2; j++)
            for (int k = 0; k < cols1; k++)
               newM[i, j] += m1[i, k] * m2[k, j];
      return newM;
   }
   else
   {
      // количество столбцов первой матрицы должно
      // быть равно количеству строк второй матрицы
      throw new Exception ("Матрицы таких размеров
                             перемножать нельзя");
   }
}

// операция перемножения матрицы на число
static public Matrix operator *(Matrix m, double d)
{
   // создание матрицы-результата
   int rows = m.Rows, cols = m.Cols;
   Matrix newM = new Matrix(rows, cols);
                                                           87