Matrix Multiplication
Matrix multiplication का मतलब
Matrix बस संख्याओं का एक grid है जो rows और columns में सजा होता है — C में हम इसे 2D array के रूप में रखते हैं। दो matrices को गुणा करना उन्हें एक नई matrix में मिलाता है, पर सीधे मेल खाते cells गुणा करके नहीं। बल्कि result का हर cell पहली matrix की पूरी row और दूसरी की पूरी column से बनता है।
यही "row times column" विचार इस topic का दिल है। एक बार समझ आ जाए, तो C program बस तीन loops है जो इसे स्वचालित करते हैं।
नियम: गुणा कब हो सकता है?
आप किन्हीं भी दो matrices को गुणा नहीं कर सकते। एक सख़्त नियम है:
पहली matrix के columns दूसरी की rows के बराबर होने चाहिए। अगर A m×n है और B n×p, तो result C m×p होती है। दोनों भीतरी n मान मेल खाने चाहिए।
हमारे उदाहरण में दोनों matrices 2×2 हैं, तो A के columns (2) B की rows (2) के बराबर हैं, और result भी 2×2 है।
एक result cell कैसे बनता है
चलिए दो 2×2 matrices लें और सिर्फ़ ऊपर-बाएँ cell निकालें, ताकि pattern दिखे:
A = | 1 2 | B = | 5 6 |
| 3 4 | | 7 8 |
c[0][0] = (A की row 0) . (B का col 0)
= 1*5 + 2*7
= 5 + 14
= 19तो ऊपर-बाएँ result 19 है। यही row-times-column विचार हर cell के लिए दोहराते हैं: c[0][1] = 1*6 + 2*8 = 22, वगैरह।
पूरा program
यहाँ 2×2 matrices के लिए पूरा C program है, result matrix शून्य से शुरू करते हुए।
#include <stdio.h>
int main() {
int a[2][2] = {{1, 2}, {3, 4}};
int b[2][2] = {{5, 6}, {7, 8}};
int c[2][2] = {0}; // हर cell 0 से शुरू
for (int i = 0; i < 2; i++) // result की हर row
for (int j = 0; j < 2; j++) // result का हर column
for (int k = 0; k < 2; k++) // साझा dimension
c[i][j] += a[i][k] * b[k][j];
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++)
printf("%d ", c[i][j]);
printf("\n");
}
return 0;
}19 22
43 50
तीन nested loops क्यों?
हर loop का साफ़ काम है:
| Loop | Variable | इसका काम |
|---|---|---|
| बाहरी | i | Result row चुनता है |
| बीच का | j | Result column चुनता है |
| भीतरी | k | Row×column products जोड़ता है |
बाहरी दो loops एक result cell पर इशारा करते हैं; भीतरी loop उस cell की value साझा dimension पर चलकर भरता है। यही row-times-column नियम code में बदला हुआ है।
आम गलतियाँ
- Result matrix को 0 से initialise करना भूलना, जिससे
+=garbage पर जुड़ता है। - Row × column करने के बजाय cells सीधे गुणा करना (
a[i][j] * b[i][j])। - Dimension नियम अनदेखा करके असंगत matrices गुणा करने की कोशिश।
a[i][k] * b[k][j]में index क्रम बदलना — साझाkमेल खाना चाहिए।
Program को बढ़ाकर 2×3 matrix को 3×2 matrix से गुणा करें। Array sizes और loop limits बदलें, और पुष्टि करें कि result 2×2 है। यह साबित करता है कि आप dimension नियम समझते हैं।
सारांश
- Matrices पहली की row को दूसरी के column से मिलाकर गुणा होती हैं।
- पहली के columns दूसरी की rows के बराबर हों (m×n गुणा n×p देता है m×p)।
- हर cell
c[i][j],kपरa[i][k]*b[k][j]जोड़ता है। - तीन nested loops: row, column, और साझा dimension।
- जोड़ने से पहले result matrix को हमेशा 0 से initialise करें।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
C में दो matrices कब गुणा हो सकती हैं?
Result matrix का हर element कैसे बनता है?
c[i][j] पहली matrix की i-वीं row और दूसरी की j-वें column के products का योग है। संगत elements गुणा करके जोड़ते हैं: c[i][j] = a[i][0]*b[0][j] + a[i][1]*b[1][j] + ...।C में matrix multiplication को तीन nested loops क्यों चाहिए?
i और column j)। तीसरा, सबसे भीतरी loop k साझा dimension पर चलकर उस cell के लिए row-times-column योग निकालता है। तो तीनों चाहिए: दो cell ढूँढने के लिए, एक उसकी value बनाने के लिए।Result matrix शून्य से क्यों शुरू होनी चाहिए?
+= से एक-एक करके products जोड़कर बनता है। अगर cell 0 के बजाय garbage से शुरू हो, तो अंतिम योग गलत होगा। Result matrix को सब zeros से initialise करने से हर cell को साफ़ शुरुआत मिलती है।