দুটি ২D ম্যাট্রিক্স গুণ করার স্ট্যান্ডার্ড অ্যালগরিদম (ট্রিপল নেস্টেড লুপ)।
নিয়ম
A (m×n) × B (n×p) = C (m×p)
C[i][j] = Σ A[i][k] × B[k][j] (k=0 to n-1)
সমাধান
const multiplyMatrices = (a, b) => {
// ভ্যালিডেশন
if (!Array.isArray(a) || !Array.isArray(b) || !a.length || !b.length) {
throw new Error('Arguments must be 2D arrays');
}
const rowsA = a.length;
const colsA = a[0].length;
const colsB = b[0].length;
if (b.length !== colsA) {
throw new Error('Columns of A must equal rows of B');
}
// রেজাল্ট ইনিশিয়ালাইজ
const result = Array.from({ length: rowsA }, () =>
Array(colsB).fill(0)
);
// ট্রিপল লুপ
for (let i = 0; i < rowsA; i++) {
for (let j = 0; j < colsB; j++) {
for (let k = 0; k < colsA; k++) {
result[i][j] += a[i][k] * b[k][j];
}
}
}
return result;
};
// টেস্ট (5×4) × (4×6) = (5×6)
const a = [
[1, 2, 3, 1],
[4, 5, 6, 1],
[7, 8, 9, 1],
[1, 1, 1, 1],
[5, 7, 2, 6]
];
const b = [
[1, 4, 7, 3, 4, 6],
[2, 5, 8, 7, 3, 2],
[3, 6, 9, 6, 7, 8],
[1, 1, 1, 2, 3, 6]
];
console.log(multiplyMatrices(a, b));
অপ্টিমাইজেশন টিপস
- লুপ অর্ডার i,k,j: ক্যাশ লোকালিটি বেড়ায় (Row-major order)
- Block/Tile মাল্টিপ্লিকেশন: বড় ম্যাট্রিক্সের জন্য
- Strassen: O(n²·⁸¹) - বড় ম্যাট্রিক্সের জন্য
- WebAssembly/GPU: প্রোডাকশন গ্রেডের জন্য
উৎপাদন
[ [ 15, 33, 51, 37, 34, 40 ], [ 33, 78, 123, 85, 76, 88 ], [ 51, 123, 195, 133, 118, 136 ], [ 7, 16, 25, 18, 17, 22 ], [ 31, 73, 115, 88, 73, 96 ] ]