Интерпретация программы для поиска определителя матрицы - PullRequest
0 голосов
/ 19 ноября 2018

Это пример кода, который я нашел для вычисления определителя матрицы (nxn), и он отлично работает, и все, но у меня возникают проблемы с пониманием того, что происходит при преобразовании в раздел треугольной формы. Может кто-нибудь объяснить, что происходит в «Преобразовании в верхнюю треугольную часть»?

У меня нет проблем с вычислением детерминанта самостоятельно или выполнением каких-либо преобразований верхней треугольной формы, но я просто не понимаю, как это все переводится здесь, в этой программе.

ii) Что происходит с целыми числами (i, j, k, l)? В частности, что делает k и l? Что происходит внутри конструкции IF? Что касается матрицы A, я знаю, что что-то вроде A (i, j) указывает ее положение в матрице, и это все, что мне когда-либо требовалось для любых матричных программ, с которыми я работал в прошлом.

=============================================== =========================

    !Function to find the determinant of a square matrix
    !Description: The subroutine is based on two key points:
    !1] A determinant is unaltered when row operations are performed: Hence, 
    using this principle,
    !row operations (column operations would work as well) are used
    !to convert the matrix into upper traingular form
    !2]The determinant of a triangular matrix is obtained by finding the 
    product of the diagonal elements

    REAL FUNCTION FindDet(matrix, n)
        IMPLICIT NONE
        REAL, DIMENSION(n,n) :: matrix
        INTEGER, INTENT(IN) :: n
        REAL :: m, temp
        INTEGER :: i, j, k, l
        LOGICAL :: DetExists = .TRUE.

        l = 1
        !Convert to upper triangular form
        DO k = 1, n-1
            IF (matrix(k,k) == 0) THEN
                DetExists = .FALSE.
                DO i = k+1, n
                    IF (matrix(i,k) /= 0) THEN
                        DO j = 1, n
                            temp = matrix(i,j)
                            matrix(i,j)= matrix(k,j)
                            matrix(k,j) = temp
                        END DO
                        DetExists = .TRUE.
                        l=-l
                        EXIT
                    ENDIF
                END DO
                IF (DetExists .EQV. .FALSE.) THEN
                    FindDet = 0
                    return
                END IF
            ENDIF
            DO j = k+1, n
                m = matrix(j,k)/matrix(k,k)
                DO i = k+1, n
                    matrix(j,i) = matrix(j,i) - m*matrix(k,i)
                END DO
            END DO
        END DO

        !Calculate determinant by finding product of diagonal elements
        FindDet = l
        DO i = 1, n
            FindDet = FindDet * matrix(i,i)
        END DO

    END FUNCTION FindDet

1 Ответ

0 голосов
/ 19 ноября 2018

В этой реализации вы можете интерпретировать индексы i, j, k, l следующим образом:

  • i и j: будут использоваться взаимозаменяемо (в этом коде нет последовательностирассматривать) представлять координаты строки и столбца элемента матрицы.
  • k: будет выполнять итерацию по «размеру» матрицы без значения согласованной позиции.Или, в другой абстракции, выполняется итерация по диагонали.
  • l: будет +1 или -1, чередуя свое значение каждый раз, когда алгоритм выполняет переключение строк.Принимается во внимание, что переключение любых двух строк матрицы обращает знак ее определителя.

Итак, интерпретация кода:

At each iteration over the dimension of the matrix:
  First, check if this diagonal element is zero. If it is zero:
    ALARM: maybe the matrix is degenerate.
    Let's find it out. Iterate downwards over the rest of this row, trying to find a non-zero element.
      If you find a row with a non-zero element in this column, if was a false alarm. Perform row-switch and invert the sign of the determinant. Go on.
      If there were all zeroes, then the matrix is degenerate. There is nothing else to do, determinant is zero.
  Going on. For each row below this diagonal:
    Perform sums and subtractions on the rest of the rows, constructing the diagonal matrix.
Finally, calculate the determinant by multiplying all the elements on the diagonal, taking the sign changes into acount.
...