我在代码中遗漏了一些相当基本的内容,但我看不到它。我需要通过行和和/或列总和来规范化矩阵(数组数组)。
所以
的矩阵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一样工作。但是,normalize函数没有。我无法弄清楚原因。
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);
谢谢!
答案 0 :(得分:0)
我不确定您的规范化功能会出现什么样的错误消息,但我遇到的是以下内容:
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;
}
希望这有帮助!