Написание функции обратной матрицы 2×2 на JavaScript

Шаги для вычисления обратной величины матрицы 2×2, такой как:

это:

  1. Поменять местами верхний левый и нижний правый элементы матрицы
  2. Отрицание двух оставшихся элементов
  3. Вычислите определитель по формуле:(ad - bc)
  4. Умножьте каждый элемент матрицы на 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

Оцените статью
devanswers.ru
Добавить комментарий