Будет проще, если вы используете [[Rational]]
вместо [[Int]]
, так как вы получите хорошее деление.
Возможно, вы захотите начать с реализации операций с элементарными строками.
swap :: Int -> Int -> [[Rational]] -> [[Rational]
swap r1 r2 m = --a matrix with r1 and r2 swapped
scale :: Int -> Rational -> [[Rational]] -> [[Rational]]
scale r c m = --a matrix with row r multiplied by c
addrow :: Int -> Int -> Rational -> [[Rational]] -> [[Rational]]
addrow r1 r2 c m = --a matrix with (c * r1) added to r2
Для того, чтобы на самом деле выполнить гассовское исключение, вам нужен способ решить, какое число из одной строки добавить к другой, чтобы получить ноль. Итак, учитывая две строки ..
5 4 3 2 1
7 6 5 4 3
Мы хотим добавить c раз строку 1 в строку 2, чтобы 7 стало нулем. Так 7 + c * 5 = 0
и c = -7/5
. Таким образом, чтобы решить для c все, что нам нужно, это первые элементы каждой строки. Вот функция, которая находит c:
whatc :: Rational -> Rational -> Rational
whatc _ 0 = 0
whatc a b = - a / b
Кроме того, как уже говорили другие, использование списков для представления вашей матрицы снизит производительность. Но если вы просто пытаетесь понять алгоритм, списки должны быть в порядке.