Умножение матриц - C# (179996)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Реализовывал операции с матрицами (сложение, умножение на число, обратная матрица и т.д.), дошёл до умножения. Составил алгоритм, написал код, но результат получается неверный. Сверялся с Excel и другими онлайн сервисами. Поискал на просторах интернета решение. Оно сходится с моим, но видимо я всё же запутался и где-то допустил ошибку. Полагаю, что проблема в условии циклов при умножении. Но бьюсь уже два дня и всё безрезультатно. Поможете разобраться?
Листинг программы
  1. void Mul()
  2. {
  3. float [,]A=new float[First_matrix_column_now,First_matrix_line_now];//1 матрица
  4. float [,]B=new float[Second_matrix_column_now,Second_matrix_line_now];//2 матрица
  5. float [,]C=new float[First_matrix_column_now,Second_matrix_line_now];//результат
  6. for(int i=0; i<First_matrix_column_now; i++)
  7. for (int j=0; j<First_matrix_line_now; j++)
  8. try
  9. {
  10. A[i,j] = Convert.ToInt16(First_matrix[i,j].Text);//берёт значения из TextBox'ов
  11. }
  12. catch
  13. {
  14. MessageBox.Show("Ошибка!A");
  15. goto exit;
  16. }
  17. for(int i=0; i<Second_matrix_column_now; i++)
  18. for (int j=0; j<Second_matrix_line_now; j++)
  19. try
  20. {
  21. B[i,j] = Convert.ToInt16(Second_matrix[i,j].Text);//берёт значения из TextBox'ов
  22. }
  23. catch
  24. {
  25. MessageBox.Show("Ошибка!B");
  26. goto exit;
  27. }
  28. for (int i = 0; i < First_matrix_column_now; i++)
  29. for (int j = 0; j < Second_matrix_line_now; j++)
  30. for (int k = 0; k < Second_matrix_column_now; k++)
  31. {
  32. try
  33. {
  34. C[i,j] += A[i,k] * B[k,j];//само умножение
  35. }
  36. catch
  37. {
  38. MessageBox.Show("Ошибка!C"+" "+i+"; "+j);
  39. goto exit;
  40. }
  41. }
  42. Result_matrix_column_change(First_matrix_column_now);//изменение количества TextBox'ов в соответствии с размером матрицы C (столбцы)
  43. Result_matrix_line_change(Second_matrix_line_now);//изменение количества TextBox'ов в соответствии с размером матрицы C (строки)
  44. for(int i=0; i<C.GetLength(0); i++)
  45. for (int j=0; j<C.GetLength(1); j++)
  46. Result_matrix[i,j].Text=C[i,j].ToString();
  47. exit:{}
  48. }

Решение задачи: «Умножение матриц»

textual
Листинг программы
  1. // Транспонирование матрицы
  2.         public static double[,] TransposeMatrixD(double[,] matrix)
  3.         {
  4.             int m = matrix.GetLength(0);
  5.             int n = matrix.GetLength(1);
  6.  
  7.             double[,] matrixT = new double[n, m];
  8.  
  9.             for (int i = 0; i < n; i++)
  10.             {
  11.                 for (int j = 0; j < m; j++)
  12.                 {
  13.                     matrixT[i, j] = matrix[j, i];
  14.                 }
  15.             }
  16.  
  17.             return matrixT;
  18.         }
  19.  
  20.         // Умножение матриц
  21.         public static double[,] MultiplicationMatrixD(double[,] a, double[,] b)
  22.         {
  23.             if (a.GetLength(1) != b.GetLength(0)) { throw new Exception("Матрицы нельзя перемножить"); }
  24.  
  25.             int ma = a.GetLength(0);
  26.             int mb = b.GetLength(0);
  27.             int nb = b.GetLength(1);
  28.  
  29.             double[,] r = new double[ma, nb];
  30.  
  31.             for (int i = 0; i < a.GetLength(0); i++)
  32.             {
  33.                 for (int j = 0; j < nb; j++)
  34.                 {
  35.                     for (int k = 0; k < mb; k++)
  36.                     {
  37.                         r[i, j] += a[i, k] * b[k, j];
  38.                     }
  39.                 }
  40.             }
  41.             return r;
  42.         }
  43.  
  44.         // Обратная матрица
  45.         public static double[,] InvertMatrixD(double[,] matrix)
  46.         {
  47.             int m = matrix.GetLength(0);
  48.             int n = matrix.GetLength(1);
  49.  
  50.             double[,] res = new double[m, n];
  51.  
  52.             for (int i = 0; i < m; i++)
  53.             {
  54.                 for (int j = 0; j < m; j++)
  55.                 {
  56.                     res[i, j] = matrix[i, j];
  57.                 }
  58.             }
  59.  
  60.             if (n != m)
  61.             {
  62.                 throw new Exception("Обратной матрицы не существует");
  63.             }
  64.  
  65.             int[] row = new int[n];
  66.             int[] col = new int[n];
  67.  
  68.             double[] temp = new double[n];
  69.             int hold;
  70.             int I_pivot;
  71.             int J_pivot;
  72.             double pivot;
  73.             double abs_pivot;
  74.  
  75.             // установиим row и column как вектор изменений.
  76.             for (int k = 0; k < n; k++)
  77.             {
  78.                 row[k] = k;
  79.                 col[k] = k;
  80.             }
  81.  
  82.             // начало главного цикла
  83.             for (int k = 0; k < n; k++)
  84.             {
  85.                 // найдем наибольший элемент для основы
  86.                 pivot = res[row[k], col[k]];
  87.                 I_pivot = k;
  88.                 J_pivot = k;
  89.                 for (int i = k; i < n; i++)
  90.                 {
  91.                     for (int j = k; j < n; j++)
  92.                     {
  93.                         abs_pivot = Math.Abs(pivot);
  94.                         if (Math.Abs(res[row[i], col[j]]) > abs_pivot)
  95.                         {
  96.                             I_pivot = i;
  97.                             J_pivot = j;
  98.                             pivot = res[row[i], col[j]];
  99.                         }
  100.                     }
  101.                 }
  102.  
  103.                 if (Math.Abs(pivot) < 1.0E-10)
  104.                 {
  105.                     //System.out.println("Matrix is singular !");
  106.                     throw new Exception("!");
  107.                 }
  108.  
  109.                 // Перестановка к-ой строки и к-ого столбца с стобцом и строкой, содержащий основной элемент(pivot основу)
  110.                 hold = row[k];
  111.                 row[k] = row[I_pivot];
  112.                 row[I_pivot] = hold;
  113.                 hold = col[k];
  114.                 col[k] = col[J_pivot];
  115.                 col[J_pivot] = hold;
  116.  
  117.                 // k-ую строку с учетом перестановок делим на основной элемент
  118.                 res[row[k], col[k]] = 1.0 / pivot;
  119.  
  120.                 for (int j = 0; j < n; j++)
  121.                 {
  122.                     if (j != k)
  123.                     {
  124.                         res[row[k], col[j]] = res[row[k], col[j]] * res[row[k], col[k]];
  125.                     }
  126.                 }
  127.  
  128.                 // Внутренний цикл
  129.                 for (int i = 0; i < n; i++)
  130.                 {
  131.                     if (k != i)
  132.                     {
  133.                         for (int j = 0; j < n; j++)
  134.                         {
  135.                             if (k != j)
  136.                             {
  137.                                 res[row[i], col[j]] = res[row[i], col[j]] - res[row[i], col[k]] * res[row[k], col[j]];
  138.                             }
  139.                         }
  140.                         res[row[i], col[k]] = -res[row[i], col[k]] * res[row[k], col[k]];
  141.                     }
  142.                 }
  143.             }
  144.  
  145.             // Переставляем назад rows
  146.             for (int j = 0; j < n; j++)
  147.             {
  148.                 for (int i = 0; i < n; i++)
  149.                 {
  150.                     temp[col[i]] = res[row[i], j];
  151.                 }
  152.  
  153.                 for (int i = 0; i < n; i++)
  154.                 {
  155.                     res[i, j] = temp[i];
  156.                 }
  157.             }
  158.  
  159.             // Переставляем назад columns
  160.             for (int i = 0; i < n; i++)
  161.             {
  162.                 for (int j = 0; j < n; j++)
  163.                 {
  164.                     temp[row[j]] = res[i, col[j]];
  165.                 }
  166.  
  167.                 for (int j = 0; j < n; j++)
  168.                 {
  169.                     res[i, j] = temp[j];
  170.                 }
  171.             }
  172.  
  173.             return res;
  174.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут