矩阵乘法:四循环与三循环
Matrix Multiplication: Four Loops vs Three Loops
虽然我的代码 运行 没有错误,但我的结果矩阵(即 C)不正确。
C应该是什么:[6, 20, 3, 5],[-3, 3,-2, 0],[30, 27, 5, 12],[9, 13, 8, 4].
根据我的代码,C 目前是什么:[35,45,25,15],[14,18,10,6],[-14,-18,-10,-6],[ 14,18,10,6]
我感觉这是因为我的循环与结果矩阵不匹配,但我似乎无法弄清楚这个问题。
我还注意到该论坛上的其他矩阵乘法线程使用 3 个循环,而不是我的 4 个循环。如果这是我错误的原因,你能解释一下原因吗? 2 个单独的行和 2 个单独的列不应该有一个迭代吗?
const A = [ [-4,0,5],
[-3,-1,2],
[6,7,-2],
[1, 1, 2]
];
const B = [ [1, 0, 3, 0],
[4,5,-1, 2],
[2, 4, 3, 1]
];
C = [];
for (var i =0; i< A.length; i++){
C[i] = [];
for (var j =0 ; j< A[j].length; j++){
//console.log(A[i][j]);
for (var y = 0 ; y < B[0].length ; y++){
C[i][y] = 0;
for (var x = 0 ; x < B.length ; x++){
//console.log(B[x][y]+ "["+x+","+y+"]");
//console.log(C[i][y]+ "["+i+","+y+"]");
C[i][y] += A[i][j] * B[x][y];
}
console.log(C[i][y] + "[" + i + "," +y+"] is the resultant matrix");
}
}
}
console.log(JSON.stringify(C)); //to print out resultant matrix in array format
您不需要使用四个循环。你只需要三个循环就是问题所在。用于问题的嵌套循环数不是您的选择。
这道题只需要三个嵌套循环。矩阵相乘。我们将第一个矩阵的每一行的每个元素与第二个矩阵的每一列的 对应的 元素相乘。
现在你需要了解的是第三个嵌套循环将生成-4,0,5
。此时我们不需要另一个循环,因为我们将它们添加到相应的值。并非每个值都添加到所有值。
const A = [ [-4,0,5],
[-3,-1,2],
[6,7,-2],
[1, 1, 2]
];
const B = [ [1, 0, 3, 0],
[4,5,-1, 2],
[2, 4, 3, 1]
];
const C = [];
for(let i = 0; i < A.length; i++){
C[i] = []
for(let j = 0; j < B[0].length; j++){
C[i][j] = 0
for(let k = 0; k < A[0].length; k++){
C[i][j] += A[i][k] * B[k][j];
}
}
}
//[6, 20, 3, 5],[-3, 3,-2, 0],[30, 27, 5, 12],[9, 13, 8, 4]
console.log(C);
虽然我的代码 运行 没有错误,但我的结果矩阵(即 C)不正确。 C应该是什么:[6, 20, 3, 5],[-3, 3,-2, 0],[30, 27, 5, 12],[9, 13, 8, 4].
根据我的代码,C 目前是什么:[35,45,25,15],[14,18,10,6],[-14,-18,-10,-6],[ 14,18,10,6]
我感觉这是因为我的循环与结果矩阵不匹配,但我似乎无法弄清楚这个问题。
我还注意到该论坛上的其他矩阵乘法线程使用 3 个循环,而不是我的 4 个循环。如果这是我错误的原因,你能解释一下原因吗? 2 个单独的行和 2 个单独的列不应该有一个迭代吗?
const A = [ [-4,0,5],
[-3,-1,2],
[6,7,-2],
[1, 1, 2]
];
const B = [ [1, 0, 3, 0],
[4,5,-1, 2],
[2, 4, 3, 1]
];
C = [];
for (var i =0; i< A.length; i++){
C[i] = [];
for (var j =0 ; j< A[j].length; j++){
//console.log(A[i][j]);
for (var y = 0 ; y < B[0].length ; y++){
C[i][y] = 0;
for (var x = 0 ; x < B.length ; x++){
//console.log(B[x][y]+ "["+x+","+y+"]");
//console.log(C[i][y]+ "["+i+","+y+"]");
C[i][y] += A[i][j] * B[x][y];
}
console.log(C[i][y] + "[" + i + "," +y+"] is the resultant matrix");
}
}
}
console.log(JSON.stringify(C)); //to print out resultant matrix in array format
您不需要使用四个循环。你只需要三个循环就是问题所在。用于问题的嵌套循环数不是您的选择。
这道题只需要三个嵌套循环。矩阵相乘。我们将第一个矩阵的每一行的每个元素与第二个矩阵的每一列的 对应的 元素相乘。
现在你需要了解的是第三个嵌套循环将生成-4,0,5
。此时我们不需要另一个循环,因为我们将它们添加到相应的值。并非每个值都添加到所有值。
const A = [ [-4,0,5],
[-3,-1,2],
[6,7,-2],
[1, 1, 2]
];
const B = [ [1, 0, 3, 0],
[4,5,-1, 2],
[2, 4, 3, 1]
];
const C = [];
for(let i = 0; i < A.length; i++){
C[i] = []
for(let j = 0; j < B[0].length; j++){
C[i][j] = 0
for(let k = 0; k < A[0].length; k++){
C[i][j] += A[i][k] * B[k][j];
}
}
}
//[6, 20, 3, 5],[-3, 3,-2, 0],[30, 27, 5, 12],[9, 13, 8, 4]
console.log(C);