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

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

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

Доброго времени суток. Реализовывал операции с матрицами (сложение, умножение на число, обратная матрица и т.д.), дошёл до умножения. Составил алгоритм, написал код, но результат получается неверный. Сверялся с Excel и другими онлайн сервисами. Поискал на просторах интернета решение. Оно сходится с моим, но видимо я всё же запутался и где-то допустил ошибку. Полагаю, что проблема в условии циклов при умножении. Но бьюсь уже два дня и всё безрезультатно. Поможете разобраться?
void Mul()
{
    float [,]A=new float[First_matrix_column_now,First_matrix_line_now];//1 матрица
    float [,]B=new float[Second_matrix_column_now,Second_matrix_line_now];//2 матрица
    float [,]C=new float[First_matrix_column_now,Second_matrix_line_now];//результат
    for(int i=0; i<First_matrix_column_now; i++)
        for (int j=0; j<First_matrix_line_now; j++)
            try
            {
                A[i,j] = Convert.ToInt16(First_matrix[i,j].Text);//берёт значения из TextBox'ов
            }
            catch
            {
                MessageBox.Show("Ошибка!A");
                goto exit;
            }
    for(int i=0; i<Second_matrix_column_now; i++)
        for (int j=0; j<Second_matrix_line_now; j++)
            try
            {
                B[i,j] = Convert.ToInt16(Second_matrix[i,j].Text);//берёт значения из TextBox'ов
            }
            catch
            {
                MessageBox.Show("Ошибка!B");
                goto exit;
            }   
    for (int i = 0; i < First_matrix_column_now; i++)
        for (int j = 0; j < Second_matrix_line_now; j++) 
            for (int k = 0; k < Second_matrix_column_now; k++) 
            {
                try 
                {
                    C[i,j] += A[i,k] * B[k,j];//само умножение
                } 
                catch
                {
                    MessageBox.Show("Ошибка!C"+"   "+i+"; "+j);
                    goto exit;
                }
            }
    Result_matrix_column_change(First_matrix_column_now);//изменение количества TextBox'ов в соответствии с размером матрицы C (столбцы)
    Result_matrix_line_change(Second_matrix_line_now);//изменение количества TextBox'ов в соответствии с размером матрицы C (строки)                    
    for(int i=0; i<C.GetLength(0); i++)
        for (int j=0; j<C.GetLength(1); j++)
            Result_matrix[i,j].Text=C[i,j].ToString();
    exit:{}
}

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

textual
Листинг программы
// Транспонирование матрицы
        public static double[,] TransposeMatrixD(double[,] matrix)
        {
            int m = matrix.GetLength(0);
            int n = matrix.GetLength(1);
 
            double[,] matrixT = new double[n, m];
 
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    matrixT[i, j] = matrix[j, i];
                }
            }
 
            return matrixT;
        }
 
        // Умножение матриц
        public static double[,] MultiplicationMatrixD(double[,] a, double[,] b)
        {
            if (a.GetLength(1) != b.GetLength(0)) { throw new Exception("Матрицы нельзя перемножить"); }
 
            int ma = a.GetLength(0);
            int mb = b.GetLength(0);
            int nb = b.GetLength(1);
 
            double[,] r = new double[ma, nb];
 
            for (int i = 0; i < a.GetLength(0); i++)
            {
                for (int j = 0; j < nb; j++)
                {
                    for (int k = 0; k < mb; k++)
                    {
                        r[i, j] += a[i, k] * b[k, j];
                    }
                }
            }
            return r;
        }
 
        // Обратная матрица
        public static double[,] InvertMatrixD(double[,] matrix)
        {
            int m = matrix.GetLength(0);
            int n = matrix.GetLength(1);
 
            double[,] res = new double[m, n];
 
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    res[i, j] = matrix[i, j];
                }
            }
 
            if (n != m)
            {
                throw new Exception("Обратной матрицы не существует");
            }
 
            int[] row = new int[n];
            int[] col = new int[n];
 
            double[] temp = new double[n];
            int hold;
            int I_pivot;
            int J_pivot;
            double pivot;
            double abs_pivot;
 
            // установиим row и column как вектор изменений.
            for (int k = 0; k < n; k++)
            {
                row[k] = k;
                col[k] = k;
            }
 
            // начало главного цикла
            for (int k = 0; k < n; k++)
            {
                // найдем наибольший элемент для основы
                pivot = res[row[k], col[k]];
                I_pivot = k;
                J_pivot = k;
                for (int i = k; i < n; i++)
                {
                    for (int j = k; j < n; j++)
                    {
                        abs_pivot = Math.Abs(pivot);
                        if (Math.Abs(res[row[i], col[j]]) > abs_pivot)
                        {
                            I_pivot = i;
                            J_pivot = j;
                            pivot = res[row[i], col[j]];
                        }
                    }
                }
 
                if (Math.Abs(pivot) < 1.0E-10)
                {
                    //System.out.println("Matrix is singular !");
                    throw new Exception("!");
                }
 
                // Перестановка к-ой строки и к-ого столбца с стобцом и строкой, содержащий основной элемент(pivot основу)
                hold = row[k];
                row[k] = row[I_pivot];
                row[I_pivot] = hold;
                hold = col[k];
                col[k] = col[J_pivot];
                col[J_pivot] = hold;
 
                // k-ую строку с учетом перестановок делим на основной элемент
                res[row[k], col[k]] = 1.0 / pivot;
 
                for (int j = 0; j < n; j++)
                {
                    if (j != k)
                    {
                        res[row[k], col[j]] = res[row[k], col[j]] * res[row[k], col[k]];
                    }
                }
 
                // Внутренний цикл
                for (int i = 0; i < n; i++)
                {
                    if (k != i)
                    {
                        for (int j = 0; j < n; j++)
                        {
                            if (k != j)
                            {
                                res[row[i], col[j]] = res[row[i], col[j]] - res[row[i], col[k]] * res[row[k], col[j]];
                            }
                        }
                        res[row[i], col[k]] = -res[row[i], col[k]] * res[row[k], col[k]];
                    }
                }
            }
 
            // Переставляем назад rows
            for (int j = 0; j < n; j++)
            {
                for (int i = 0; i < n; i++)
                {
                    temp[col[i]] = res[row[i], j];
                }
 
                for (int i = 0; i < n; i++)
                {
                    res[i, j] = temp[i];
                }
            }
 
            // Переставляем назад columns
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    temp[row[j]] = res[i, col[j]];
                }
 
                for (int j = 0; j < n; j++)
                {
                    res[i, j] = temp[j];
                }
            }
 
            return res;
        }

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


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

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

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