按常规解矩阵的思路设计计算方法,因为是用js写的,计算精度有限,高阶矩阵存在误差累计的问题
直接上代码
function matrix(xArr) {
var col = xArr.length;
var row = xArr[0].length;
var orderArr = [];
var divisor = 0/*除数*/, multiplier = 0;//乘数
var print = '';
var resArr = [], result = Object();
var temp = 0, tempArr = [], tempSum = 0;
// console.log(isNaN('col'))
//判断录入数据是否合法
if ((isNaN(col) && isNaN(row)) || row <= col || col <= 0) {
return null;
}
for (var k = 0; k < col; k++) {
//1、除余1
for (var i = 0; i < col; i++) {
for (var j = 0; j < row; j++) {
if (divisor == 0 && xArr[i][j] != 0) {
divisor = xArr[i][j];//赋值除数
}
if (divisor != 0) {
xArr[i][j] = xArr[i][j] / divisor;
}
print += xArr[i][j] + ' '
}
divisor = 0;//重置除数
print += '\n'
}
print += '\n\n'
//2、排序
for (var i = 0; i < col; i++) {//获取原来顺序
tempSum = 0;
for (var j = 0; j < row - 1; j++) {
if (xArr[i][j] == 0) {
tempSum++;
} else {
orderArr[i] = tempSum;
j = row - 1;//循环结束
}
}
}
//冒泡排序
for (var i = 0; i < col; i++) {//排序
for (var j = i + 1; j < col; j++) {
if (orderArr[i] > orderArr[j]) {
temp = orderArr[j];
orderArr[j] = orderArr[i];
orderArr[i] = temp;
tempArr = xArr[j];
xArr[j] = xArr[i];
xArr[i] = tempArr;
}
}
}
//3、两两相减
for (var i = k + 1; i < col; i++) {
if (orderArr[k] == orderArr[i]) {
for (var j = 0; j < row; j++) {
xArr[i][j] = xArr[i][j] - xArr[k][j]//赋值除数
}
}
}
}
//解析结果
for (var i = 0; i < col; i++) {
for (var j = i + 1; j < col; j++) {
multiplier = 0;
for (var k = 0; k < row; k++) {
if (multiplier == 0 && xArr[j][k] != 0) {
multiplier = xArr[i][k];//赋值乘数
}
xArr[i][k] -= xArr[j][k] * multiplier
}
}
}
for (var i = 0; i < col; i++) {
resArr[i] = '';
for (var j = 0; j < row - 1; j++) {
if (xArr[i][j] != 0) {
if (xArr[i][j] == 1) {
resArr[i] += 'x' + (j + 1) + '+';
} else {
resArr[i] += Math.round(xArr[i][j] * 100) / 100 + 'x' + (j + 1) + '+';
}
}
}
resArr[i] = resArr[i].slice(0, resArr[i].length - 1)
resArr[i] += '=' + Math.round(xArr[i][row - 1] * 100) / 100;
}
result['resArr'] = xArr;//结果
result['result'] = resArr;//结果
result['process'] = print;//过程
return result;
}
HTML页面效果
HTML页面代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
textarea{
width: 48em;
height: 400px;
padding: 1em 1.5em;
border-radius: 1.5em;
}
#pro{
width: 100em;
height: 400px;
}
input{
padding: 0.5em 2em;
margin: 0.3em 1em 0.3em 0em;
}
</style>
</head>
<body>
<input type="button" value="计算" id="calculation">
<input type="button" value="查看过程" id="lookpro">
<div>
<textarea name="" id="in" cols="30" rows="10" placeholder="请输入矩阵"></textarea>
<textarea name="" id="out" cols="30" rows="10" disabled='disabled'></textarea>
<br>
<textarea name="" id="pro" cols="30" rows="10" style="display: none;" disabled='disabled'></textarea>
</div>
<!--
2 4 6 1
3 1 5 3
2 7 4 2
-->
</body>
<script>
//计算矩阵
function matrix(xArr) {
var col = xArr.length;
var row = xArr[0].length;
var orderArr = [];
var divisor = 0/*除数*/, multiplier = 0;//乘数
var print = '';
var resArr = [], result = Object();
var temp = 0, tempArr = [], tempSum = 0;
// console.log(isNaN('col'))
//健壮
if ((isNaN(col) && isNaN(row)) || row <= col || col <= 0) {
return null;
}
for (var k = 0; k < col; k++) {
//1、除余1
for (var i = 0; i < col; i++) {
for (var j = 0; j < row; j++) {
if (divisor == 0 && xArr[i][j] != 0) {
divisor = xArr[i][j];//赋值除数
}
if (divisor != 0) {
xArr[i][j] = xArr[i][j] / divisor;
}
print += xArr[i][j] + ' '
}
divisor = 0;//重置除数
print += '\n'
}
print += '\n\n'
//2、排序
for (var i = 0; i < col; i++) {//获取原来顺序
tempSum = 0;
for (var j = 0; j < row - 1; j++) {
if (xArr[i][j] == 0) {
tempSum++;
} else {
orderArr[i] = tempSum;
j = row - 1;//循环结束
}
}
}
//冒泡排序
for (var i = 0; i < col; i++) {//排序
for (var j = i + 1; j < col; j++) {
if (orderArr[i] > orderArr[j]) {
temp = orderArr[j];
orderArr[j] = orderArr[i];
orderArr[i] = temp;
tempArr = xArr[j];
xArr[j] = xArr[i];
xArr[i] = tempArr;
}
}
}
//3、两两相减
for (var i = k + 1; i < col; i++) {
if (orderArr[k] == orderArr[i]) {
for (var j = 0; j < row; j++) {
xArr[i][j] = xArr[i][j] - xArr[k][j]//赋值除数
}
}
}
}
//解析结果
for (var i = 0; i < col; i++) {
for (var j = i + 1; j < col; j++) {
multiplier = 0;
for (var k = 0; k < row; k++) {
if (multiplier == 0 && xArr[j][k] != 0) {
multiplier = xArr[i][k];//赋值乘数
}
xArr[i][k] -= xArr[j][k] * multiplier
}
}
}
for (var i = 0; i < col; i++) {
resArr[i] = '';
for (var j = 0; j < row - 1; j++) {
if (xArr[i][j] != 0) {
if (xArr[i][j] == 1) {
resArr[i] += 'x' + (j + 1) + '+';
} else {
resArr[i] += Math.round(xArr[i][j] * 100) / 100 + 'x' + (j + 1) + '+';
}
}
}
resArr[i] = resArr[i].slice(0, resArr[i].length - 1)
resArr[i] += '=' + Math.round(xArr[i][row - 1] * 100) / 100;
}
result['resArr'] = xArr;//结果
result['result'] = resArr;//结果
result['process'] = print;//过程
return result;
}
//将字符串转为矩阵
function toNumbArr(str) {
//检查字符串是否合法
var patrn = /^[0-9\s]{1,}$/;
if (!patrn.exec(str)) {
return null;
}
//多个换行符和空格换成一个
str = str.replace(/ +/g, ' ').replace(/\n+/g, '\n');
var xArr = str.split('\n');
for (var i = 0; i < xArr.length; i++) {
xArr[i] = xArr[i].split(' ');
}
for (var i = 0; i < xArr.length; i++) {
for (var j = 0; j < xArr[0].length; j++) {
xArr[i][j] = Number(xArr[i][j]);
}
}
// console.log(xArr)
return xArr;
}
var xArr = [
[2, 4, 0, 1, 2],
[3, 8, 5, 3, 9],
[2, 5, 4, 6, 7],
[2, 1, 6, 2, 3],
]
// var xArr=[
// [2,4,6,1],
// [3,1,5,3],
// [2,7,4,2]
// ]
var result = matrix(xArr);
if (result != null) {
console.log(result.resArr);//结果
console.log(result.result);//结果
console.log(result.process);//过程
}
document.getElementById('calculation').onclick = function () {
var xArr= toNumbArr(document.getElementById('in').value)
var result = matrix(xArr);
if (result != null) {
console.log(result.resArr);//结果
console.log(result.result);//结果
console.log(result.process);//过程
document.getElementById('out').value=result.result
document.getElementById('pro').value=result.process
}
}
document.getElementById('lookpro').onclick = function () {
if(document.getElementById('pro').style.display==''){
this.value='查看过程'
document.getElementById('pro').style.display='none';
}else{
this.value='隐藏过程'
document.getElementById('pro').style.display=''
};
}
</script>
</html>