JS计算矩阵

按常规解矩阵的思路设计计算方法,因为是用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>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在Google Earth Engine (GEE) 中计算土地利用转移矩阵可以通过以下步骤实现: 1. 导入土地利用数据:使用`ee.ImageCollection`或`ee.Image`导入两幅不同时相的土地利用图像数据。 2. 提取土地利用类型:使用`ee.Image.select`选择表示土地利用类型的字段,例如`Type1995`和`Type2000`。 3. 创建区域:使用`ee.Geometry`创建感兴趣的区域,可以是一个点、线或多边形。 4. 裁剪图像:使用`ee.Image.clip`将图像裁剪为感兴趣区域内的图像。 5. 计算转移矩阵:使用`ee.Reducer.frequencyHistogram`计算两幅图像之间的土地利用转移矩阵。 下面是一个示例代码,演示了如何在GEE中计算土地利用转移矩阵: ```javascript // 导入两幅土地利用图像 var image1995 = ee.Image('image1995'); var image2000 = ee.Image('image2000'); // 选择土地利用类型字段 var type1995 = image1995.select('Type1995'); var type2000 = image2000.select('Type2000'); // 创建感兴趣的区域 var roi = ee.Geometry.Point(lon, lat).buffer(radius); // 裁剪图像 var clipped1995 = type1995.clip(roi);var clipped2000 = type2000.clip(roi); // 计算转移矩阵 var matrix = clipped1995.reduceRegion({ reducer: ee.Reducer.frequencyHistogram(), geometry: roi, scale: 30 }); // 打印转移矩阵 print(matrix); ``` 请注意,上述代码中的`image1995`和`image2000`需要替换为您自己的土地利用图像。另外,`lon`和`lat`是感兴趣区域的经纬度,`radius`是感兴趣区域的半径。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值