Как мне решить обратные матрицы 3×3 без использования библиотеки?

#javascript #math #matrix #inversion

#javascript #математика #матрица #инверсия

Вопрос:

  <html>
<head>
  <script language="JavaScript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.2.1/math.js"></script>
</head>
<body>
  <p id="result">loading result...</p>
  <script> 
   var inverted = math.inv([[1,2,4],[3,4,5],[7,8,9]]);
  document.getElementById("result").textContent = JSON.stringify(inverted);
  </script>
</body>
</html>
  

Это то, что я использую math.js но мне любопытно, как я могу сделать это, не используя библиотеку.

Комментарии:

1. Как бы вы это сделали с помощью ручки и бумаги?

2. лучший способ получить помощь здесь, в stack, — это поместить код, который вы пытались решить свою проблему (прямо сейчас вы просто просите прямое, полное решение кода), и сообщить, где вы застряли.

Ответ №1:

Убедитесь, что матрица «заполнена», как в: нет пропущенных значений.
Следующий код также работает с матрицами с количеством строк! = количество столбцов.

 var originalMatrix=[[1,2,3],[4,5,6],[7,8,9]];
function invertMatrix(matrix) {
  return matrix.reduce(
    (acc, cv)=> {
      cv.reduce(
        (acc2, cv2, idx2)=> {
          if(acc[idx2]==undefined) acc[idx2]=[];
          acc[idx2].push(cv2);
        },[]
      );
      return acc;
    },[]
  );
};

console.log(originalMatrix);
console.log(invertMatrix(originalMatrix));
console.log(invertMatrix(invertMatrix(originalMatrix)));

var anotherMatrix=[[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]];

console.log(anotherMatrix);
console.log(invertMatrix(anotherMatrix));
console.log(invertMatrix(invertMatrix(anotherMatrix)));  
 .as-console-wrapper { max-height: 100% !important; top: 0; }  

Комментарии:

1. Похоже, что ваш код вычисляет транспонирование матрицы. Это, в общем, не обратное

2. @dmuir, вы правы. Я неправильно прочитал / неправильно понял вопрос. Когда я изучал матрицы, это было не на английском = это вызывает (слишком много) недоразумений… Мне все еще нужно остановиться и подумать, какая точка, а какая линия, например, при встрече с «Вершиной» и «Ребром»… Скоро я буду работать над кодом для «обратного». Еще раз спасибо!

Ответ №2:

из https://codegolf.stackexchange.com/questions/168828/find-the-inverse-of-a-3-by-3-matrix/168837#168837

Это вариант кода js, который предоставляет 2d-массив размером 3×3, а не один массив размером 9×1.

 function inverse(m) {
  [
    [a, b, c],
    [d, e, f],
    [g, h, i]
  ] = m;
  let x = e * i - h * f,
    y = f * g - d * i,
    z = d * h - g * e,
    det = a * x   b * y   c * z;
  return det != 0 ? [
    [x, c * h - b * i, b * f - c * e],
    [y, a * i - c * g, d * c - a * f],
    [z, g * b - a * h, a * e - d * b]
  ].map(r => r.map(v => v /= det)) : null;
}

function writeout(arr) {
  return JSON.stringify(arr, function(key, val) {
    return val.toFixed ? Number(val.toFixed(4)) : val;
  });
}

const mA = [
  [1, 2, 3],
  [4, 5, 3],
  [3, 1, 2]
];
const invA = inverse(mA);
const inv_invA = inverse(invA);


document.getElementById("result").innerHTML = "<p>mA:</br>"   writeout(mA)   "</p>"  
  "<p>invA:</br>"   writeout(invA)   "</p>"  
  "<p>inv_invA:</br>"   writeout(inv_invA)   "</p>";  
 <p id="result">loading result...</p>