Wael Tayara Ответов: 2

Вычисляя Определитель массива за собой рекурсивный с#


Ну, это вызывает у меня настоящую головную боль. Я строю матричную детерминантную функцию для вычисления детерминанта NxN и использую рекурсию. Логика работает правильно, но я не могу правильно вычислить конечное значение.

Вот мой код для матричного детерминанта:

public static double determinant(double[,]array){
           double det=0;
           double total = 0;
           double[,] tempArr = new double[array.GetLength(0) - 1, array.GetLength(1) - 1];

           if(array.GetLength(0)==2)
           {
               det = array[0, 0] * array[1, 1] - array[0, 1] * array[1, 0];
           }

           else {

               for (int i = 0; i <1; i++)
               {
                   for (int j = 0; j < array.GetLength(1); j++)
                   {
                       if (j % 2 != 0) array[i, j] = array[i, j] * -1;
                      tempArr= fillNewArr(array, i, j);
                      det+=determinant(tempArr);
                      total =total + (det * array[i, j]);
                   }
               }
                }
           return det;
       }

а что касается метода fillNewArr, то это просто метод обрезки массива, метод заключается в следующем:
public static double[,] fillNewArr(double[,] originalArr, int row, int col)
        {
            double[,] tempArray = new double[originalArr.GetLength(0) - 1, originalArr.GetLength(1) - 1];

            for (int i = 0, newRow = 0; i < originalArr.GetLength(0); i++)
            {
                if (i == row)
                    continue;
                for (int j = 0, newCol=0; j < originalArr.GetLength(1); j++)
                {
                    if ( j == col) continue;
                    tempArray[newRow, newCol] = originalArr[i, j];

                    newCol++;
                }
                newRow++;
            }
            return tempArray;

        }

Метод работает так, как он должен был "я предполагаю", но конечный результат не вычисляется правильным образом, почему бы это не было?!

Пример массива 4x4:

{2 6 6 2}
{2 7 3 6}
{1 5 0 1}
{3 7 0 7}

Конечный результат должен быть -168, а мой-104!

Mehdi Gholam

Очевидно, что ваша логика неверна, если вы не получаете ожидаемого ответа.

2 Ответов

Рейтинг:
2

Member 14689791

Правило сарусса может быть полезно для более быстрого и эффективного вычисления детерминанта в памяти. потому что это не рекурсивно. Вы можете получить заявку на https://github.com/apanasara/Faster_nxn_Determinant


OriginalGriff

Хотя я аплодирую вашему стремлению помогать людям, это хорошая идея придерживаться новых вопросов, а не 5-летних. После такого количества времени маловероятно, что оригинальный плакат вообще заинтересован в проблеме больше!
Ответы на старые вопросы можно рассматривать как охоту за репостами, которая является формой злоупотребления сайтом. Более триггерные счастливые среди нас начнут процесс запрета вас с сайта, если вы не будете осторожны. Придерживайтесь новых вопросов, и все будет хорошо.

Рейтинг:
13

Wael Tayara

Это та часть, где следует внести изменения :)

for (int j = 0; j < array.GetLength(1); j++)
               {
               tempArr= fillNewArr(array, 0, j);
               det=determinant(tempArr) *( Math.Pow(-1,j)* array[0,j]);
               total += det; ;
               }