#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:
Это вариант кода 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>