在 Javascript 如何将一个多维数组除以另一个数组

In Javascript how do I divide a multidimensional array by another array

我的代码中遗漏了一些相当基本的东西,但我看不到它。我需要通过行总和 and/or 列总和来规范化我的矩阵(数组的数组)。

所以

的矩阵
matrix =[
[1, 2, 3, 10],
[4, 5, 6, 11],
[7, 8, 9, 12]
];

对于行归一化,这将导致第一行/行总和中的每个元素(例如 1/16、2/16、3/16 和 10/16)。所以我的行规范化数组将是

normalizedmatrix =[
[0.0625,        0.125,          0.1875,         0.625],
[0.153846154,   0.192307692,    0.230769231,    0.423076923],
[0.194444444,   0.222222222,    0.25,           0.333333333]
];

rowSum 函数与 colSum 函数一样工作。但是,规范化功能没有。我不知道为什么。

function rowSum(myMatrix) {
myTotal = [];
for (row = 0; row < myMatrix.length; row++) {
    myTotal[row] = myMatrix[row].reduce(function (a, b) {
        return a + b;
    });
}
return myTotal;
}

function colSum(myMatrix) {
myTotal = [];
for (col = 0; col < myMatrix[0].length; col++) {
    myTotal[col] = myMatrix.map(function (v) {
        return v[col]
    }).reduce(function (a, b) {
        return a + b
    });
}
return myTotal;
}

function normalize(myMatrix) {
myNormal = [];
myRowSums = rowSum(myMatrix);
//myColSums = colSum(myMatrix);

for (row = 0; row < myMatrix.length; row++) {
    for (col = 0; col < myMatrix[0].length; col++) {
        myNormal[row][col] = myMatrix[row][col] / myRowSums[row]; // for row normalize
        // myNormal[row][col] = myMatrix /myColSums[col]; // for column normalize   
    }
}
return myNormal;
}

var matrix = [
[1, 2, 3, 10],
[4, 5, 6, 11],
[7, 8, 9, 12]
];

var rsum = rowSum(matrix);
var csum = colSum(matrix);
var normalsum = normalize(matrix);

谢谢!

我不确定您收到的规范化函数的错误消息类型是什么,但我 运行 得到的是以下内容:

Uncaught TypeError: Cannot set property '0' of undefined

此错误是由于您声明了 myNormal = [] 而导致的。如果你在 DevTools 中尝试这个,你会看到以下会产生上面的错误:

var arr = [];
arr[0][0] = 1; // Uncaught TypeError: Cannot set Property '0' of undefined

这是因为您正试图访问一个包含在尚不存在的值中的值。在上面的例子中,我们可以很容易地只做 arr[0] = 1,一切都会好起来的。但是,语句 arr[0][0] 首先尝试访问位于 arr[0] 的值,然后访问它的 属性 0。由于该值不存在,我们得到上述错误。这是您第一次尝试在 myNormal 数组中设置值时发生的情况。

我们可以解决此问题的一种方法是预先填充您的 myNormal 数组以匹配输入矩阵的维度。

例如:

// Create an empty matrix of size row x col
function emptyMatrix(row, col) {
   // The idea here is to build an Array of size "row", and then we will map
   // over each row and build an Array of size "col".
   var rows = Array.apply(null, Array(row));

   return rows.map(function () {
     return Array(col);
   });
}

在上面,我们有我们的方法可以为给定的维度构建一个空数组矩阵。我们可以通过执行以下操作来使用它来修复 normalize 函数:

function normalize(myMatrix) {
    var numRows = myMatrix.length,
        numCols = myMatrix[0].length,
        myNormal = emptyMatrix(numRows, numCols),
        myRowSums = rowSum(myMatrix),
        // myColSums = colSum(myMatrix);
        row,
        col;

    for (row = 0; row < numRows; row++) {
        for (col = 0; col < numCols; col++) {
            myNormal[row][col] = myMatrix[row][col] / myRowSums[row];
            // myNormal[row][col] = myMatrix[row][col] / myColSums[col]; // for column normalize 
        }
    }

    return myNormal;
}

希望对您有所帮助!