mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-04 15:39:42 +08:00
finishing touches on matrixMult.js
This commit is contained in:
@ -1,87 +1,87 @@
|
||||
|
||||
// MatrixCheck tests to see if all of the rows of the matrix inputted have similar size columns
|
||||
const matrixCheck = (matrix)=>{
|
||||
let columnNumb;
|
||||
for (let index = 0; index < matrix.length; index++){
|
||||
if (index == 0){
|
||||
columnNumb = matrix[index].length;
|
||||
} else if (matrix[index].length != columnNumb){
|
||||
const matrixCheck = (matrix) => {
|
||||
let columnNumb
|
||||
for (let index = 0; index < matrix.length; index++) {
|
||||
if (index === 0) {
|
||||
columnNumb = matrix[index].length
|
||||
} else if (matrix[index].length !== columnNumb) {
|
||||
console.log('The columns in this array are not equal')
|
||||
} else {
|
||||
return columnNumb;
|
||||
return columnNumb
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// tests to see if the matrices have a like side, i.e. the row length on the first matrix matches the column length on the second matrix, or vise versa.
|
||||
const twoMatricesCheck = (first, second)=>{
|
||||
const [firstRowLength, secondRowLength, firstColLength, secondColLength] = [first.length, second.length, matrixCheck(first), matrixCheck(second)];
|
||||
if (firstRowLength != secondColLength || secondRowLength != firstColLength){
|
||||
console.log('These matrices do not have a common side');
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
const twoMatricesCheck = (first, second) => {
|
||||
const [firstRowLength, secondRowLength, firstColLength, secondColLength] = [first.length, second.length, matrixCheck(first), matrixCheck(second)]
|
||||
if (firstRowLength !== secondColLength || secondRowLength !== firstColLength) {
|
||||
console.log('These matrices do not have a common side')
|
||||
return false
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// returns an empty array that has the same number of rows as the left matrix being multiplied.
|
||||
//Uses Array.prototype.map() to loop over the first (or left) matrix and returns an empty array on each iteration.
|
||||
const initiateEmptyArray = (first, second)=>{
|
||||
if (twoMatricesCheck(first, second)){
|
||||
const emptyArray = first.map(()=>{
|
||||
return [''];
|
||||
// Uses Array.prototype.map() to loop over the first (or left) matrix and returns an empty array on each iteration.
|
||||
const initiateEmptyArray = (first, second) => {
|
||||
if (twoMatricesCheck(first, second)) {
|
||||
const emptyArray = first.map(() => {
|
||||
return ['']
|
||||
})
|
||||
return emptyArray;
|
||||
}else{
|
||||
return false;
|
||||
return emptyArray
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// Finally, `matrixMult` uses `Array.prototype.push()`, multiple layers of nested `for` loops, the addition assignment `+=` operator and multiplication operator `*` to perform the dot product between two matrices of differing sizes.
|
||||
// Dot product, takes the row of the first matrix and multiplies it by the column of the second matrix, the `twoMatricesCheck` tested to see if they were the same size already.
|
||||
// The dot product for each iteration is then saved to its respective index into `multMatrix`.
|
||||
const matrixMult = (firstArray, secondArray)=>{
|
||||
let multMatrix = initiateEmptyArray(firstArray, secondArray);
|
||||
for (let rm = 0; rm < firstArray.length; rm++){
|
||||
rowMult = [];
|
||||
for (let col = 0; col < firstArray[0].length; col++){
|
||||
rowMult.push(firstArray[rm][col]);
|
||||
// Dot product, takes the row of the first matrix and multiplies it by the column of the second matrix, the `twoMatricesCheck` tested to see if they were the same size already.
|
||||
// The dot product for each iteration is then saved to its respective index into `multMatrix`.
|
||||
const matrixMult = (firstArray, secondArray) => {
|
||||
const multMatrix = initiateEmptyArray(firstArray, secondArray)
|
||||
for (let rm = 0; rm < firstArray.length; rm++) {
|
||||
const rowMult = []
|
||||
for (let col = 0; col < firstArray[0].length; col++) {
|
||||
rowMult.push(firstArray[rm][col])
|
||||
}
|
||||
for (let cm = 0; cm < firstArray.length; cm++){
|
||||
colMult = [];
|
||||
for (let row = 0; row < secondArray.length; row++){
|
||||
colMult.push(secondArray[row][cm]);
|
||||
for (let cm = 0; cm < firstArray.length; cm++) {
|
||||
const colMult = []
|
||||
for (let row = 0; row < secondArray.length; row++) {
|
||||
colMult.push(secondArray[row][cm])
|
||||
}
|
||||
let newNumb = 0;
|
||||
for (let index = 0; index < rowMult.length; index++){
|
||||
newNumb += rowMult[index] * colMult[index];
|
||||
let newNumb = 0
|
||||
for (let index = 0; index < rowMult.length; index++) {
|
||||
newNumb += rowMult[index] * colMult[index]
|
||||
}
|
||||
multMatrix[rm][cm] = newNumb;
|
||||
multMatrix[rm][cm] = newNumb
|
||||
}
|
||||
}
|
||||
return multMatrix;
|
||||
return multMatrix
|
||||
}
|
||||
|
||||
const firstMatrix = [
|
||||
[1, 2],
|
||||
[3, 4]
|
||||
];
|
||||
]
|
||||
|
||||
const secondMatrix = [
|
||||
[5, 6],
|
||||
[7, 8]
|
||||
];
|
||||
]
|
||||
|
||||
console.log(matrixMult(firstMatrix, secondMatrix)); // [ [ 19, 22 ], [ 43, 50 ] ]
|
||||
console.log(matrixMult(firstMatrix, secondMatrix)) // [ [ 19, 22 ], [ 43, 50 ] ]
|
||||
|
||||
const thirdMatrix = [
|
||||
[-1, 4, 1],
|
||||
[7, -6, 2],
|
||||
];
|
||||
[7, -6, 2]
|
||||
]
|
||||
const fourthMatrix = [
|
||||
[2, -2],
|
||||
[5, 3],
|
||||
[3, 2],
|
||||
];
|
||||
[3, 2]
|
||||
]
|
||||
|
||||
console.log(matrixMult(thirdMatrix, fourthMatrix)); // [ [ 21, 16 ], [ -10, -28 ] ]
|
||||
console.log(matrixMult(thirdMatrix, fourthMatrix)) // [ [ 21, 16 ], [ -10, -28 ] ]
|
||||
|
Reference in New Issue
Block a user