Шаги для вычисления обратной величины матрицы 2×2, такой как:
это:
- Поменять местами верхний левый и нижний правый элементы матрицы
- Отрицание двух оставшихся элементов
- Вычислите определитель по формуле:
(ad - bc)
- Умножьте каждый элемент матрицы на
1 /determinate
.
Таким образом, обратная величина может быть вычислена как:
Для реализации в виде алгоритма матрица будет представлена в виде массива из 2 массивов. Например: [[a,b], [c,d]].
Первый шаг — поменять местами [0][0]
и [1][1]
:
let temp = [0][0];
matrix[0][0] = matrix[1][1];
matrix[1][1] = temp;
Затем для шага 2 нам нужно отрицать последние оставшиеся элементы [0][1]
и [1][0]
. Их можно отрицать, просто умножив на -1
.
matrix[0][1] *= -1;
matrix[1][0] *= -1;
a *= -1
— это еще один более короткий способ записать a = a * -1
.
Переходим к вычислению определителя по формуле ad - bc
.
Этот шаг представляет собой простое вычисление:
let determinate = (matrix[0][0] * matrix[1][1]) - (matrix[0][1] * matrix[1][0]);
Последний шаг можно сделать легко, умножив каждый элемент на 1/determinate
.
matrix[0][0] *= (1/determinate);
matrix[0][1] *= (1/determinate);
matrix[1][0] *= (1/determinate);
matrix[1][1] *= (1/determinate);
Мы можем рефакторить этот шаг в несколько более красивых утверждений, используя встроенные функции map()
, flat()
и splice()
:
const flatMapped = matrix.flat().map(el => el * 1/determinate);
matrix = [flatMapped.splice(0, 2), flatMapped.splice(0, 2)];
-
Первый оператор сглаживает массив, например, с
[[a,b], [c,d]]
до[a,b,c,d]
, а затем умножает каждый элемент на наш определитель. -
Второе утверждение немного сложнее для понимания. Функция
splice()
удаляет элементы из массива, принимая в качестве первого параметра начальный индекс, а в качестве второго — необязательный счетчик удалений, и возвращает их в виде массива.- Чтобы вернуть его в формат
[[a,b][c,d]]
, мы вызываемsplice()
для первых двух элементов (начиная с индекса 0), чтобы удалить их и добавить в матрицу. - Однако поскольку при первом вызове
splice()
были удалены элементыa
иb
, остались толькоc
иd
(splice()
является изменяемым), мы вызываем его снова с теми же аргументами, чтобы получить последние 2 элемента и добавить их в матрицу для возврата.
- Чтобы вернуть его в формат
Теперь мы можем собрать все шаги вместе, чтобы создать нашу функцию calculateInverse
.
function calculateInverse(matrix) {
// Step 1 - Swap a and d
let temp = [0][0];
matrix[0][0] = matrix[1][1];
matrix[1][1] = temp;
// Step 2 - Negate b and c
matrix[0][1] *= -1;
matrix[1][0] *= -1;
// Step 3 - Calulate determinate
let determinate = (matrix[0][0] * matrix[1][1]) - (matrix[0][1] * matrix[1][0]);
// Step 4 - Multiply indices by 1/determinate
const flatMapped = matrix.flat().map(el => el * 1/determinate);
matrix = [flatMapped.splice(0, 2), flatMapped.splice(0, 2)];
return matrix
}
Обратите внимание: эта функция будет работать только для матрицы 2×2. Для вычисления обратной величины матрицы большего размера существуют дополнительные требования.
Возможные дальнейшие шаги по улучшению нашей функции:
- Добавление некоторых проверок, чтобы убедиться, что переданный аргумент является массивом, который содержит 2 массива по 2 элемента.
- Проверка того, что элементы в массивах являются числами.
- Если определитель равен нулю, индекс не имеет инверса, можно добавить проверку для этого сценария.
- Измените функцию так, чтобы индексы матрицы передавались в качестве отдельных аргументов (Подсказка: …args).
- Измените шаг 4 так, чтобы исходный массив не модифицировался (Подсказка: slice).
Спасибо за чтение 🙂
Ссылки:
-
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
-
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
-
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat