Умножение квадратной матрицы на вектор - C#

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

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

Я не могу понят вот у меня перегруженный метод умножения матрицы на вектор:
Листинг программы
  1. public static Vektor operator *(Kvadrat_mat b, Vektor a )
  2. {
  3. Vektor temp = new Vektor(b.GetN());
  4. double[] c = new double[b.GetN()];
  5. for (int i = 0; i < b.GetN();i++)
  6. for (int j = 0; j < b.GetN(); j++)
  7. {
  8. c[i] += b.mat[i,j] * a.GetI(j);
  9. }
  10. for (int i = 0; i<b.GetN();i++)
  11. temp.SetI(i, c[i]);
  12. return temp;
  13. }
Вот код вызова и применения этого метода:
Листинг программы
  1. Vektor temp = new Vektor(dataGridView2.RowCount);
  2. for (int i =0; i<dataGridView2.ColumnCount;i++)
  3. for (int j = 0; j < dataGridView2.RowCount; j++)
  4. {
  5. a.SetI(i, j, Convert.ToDouble(dataGridView1[i, j].Value));
  6. }
  7. for (int i = 0; i< dataGridView2.ColumnCount; i++)
  8. for (int j = 0; j < dataGridView2.RowCount; j++)
  9. {
  10. // MessageBox.Show("j = " + j + " values = " + dataGridView2[i, j].Value);
  11. temp.SetI(j, Convert.ToDouble(dataGridView2[i, j].Value));
  12. }
  13. temp = a*temp;
  14. dataGridView3.ColumnCount = 1;
  15. dataGridView3.RowCount = temp.GetN();
  16. for (int i = 0; i < dataGridView3.ColumnCount; i++)
  17. for(int j = 0; j < dataGridView3.RowCount; j++)
  18. dataGridView3[i,j].Value = temp.GetI(j);
Заранее спасибо)

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

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.         }

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


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

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

12   голосов , оценка 3.583 из 5

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

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

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