在 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;
}
希望对您有所帮助!
我的代码中遗漏了一些相当基本的东西,但我看不到它。我需要通过行总和 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;
}
希望对您有所帮助!