4.3

משוואות לינאריות ומטריצות הפוכות

כפל מטריצות

Matrix Multiplication

מחשבים AB בארבע זוויות ורואים מדוע זו הרכבת פעולות שבה B פועלת ראשונה.

יחידת לימוד עצמאיתשיעור 3 מתוך 5כ־60 דקות כולל תרגול4 מטרות למידה
  1. 1
    נקודת פתיחהמה כבר ידוע ומה השאלה?
  2. 2
    ניבוימה יקרה במקרה הפשוט?
  3. 3
    המחשהמה באמת משתנה בתמונה?
  4. 4
    ניסוח והצדקהשם, נוסחה ולמה היא נכונה
  5. 5
    בדיקהדוגמה, תרגול ומשוב
  6. 6
    העברהמקרה חדש והמשך המסלול

שאלה לפני נוסחה

מה אנחנו מנסים לראות?

להחליט מתי AB מוגדרת, לחשב אותה לפי שורה מול עמודה, ולפרש את סדר הכפל כהרכבת שתי העתקות; בסוף נכיר גם שתי תצוגות נוספות של אותה מכפלה.

מטריצה היא מכונה לינארית. במכפלה AB המכונה B פועלת ראשונה ו־A מקבלת את הפלט שלה. חוק שורה־מול־עמודה אינו מתכון שרירותי: הוא בדיוק החוק שמאפשר לשתי המכונות להתנהג כמכונה אחת.

לפני ההמחשה: קראו רק את הכותרת “אותן שתי פעולות, שתי תוצאות”. מה לדעתכם ישתנה, מה יישאר קבוע, ואיזה סימן בתמונה יוכל להפריך את הניבוי?

לראות לפני שמחשבים · המקרה הפשוט ביותר

אותן שתי פעולות, שתי תוצאות

אי חילופיות בכפל מטריצות: שיקוף ואז הטיה שונה מהטיה ואז שיקוףSR·e₂SR · תחילה R, אחר כך SRS·e₂RS · תחילה S, אחר כך RSR·e₂=(−1,−1) ≠ (1,−1)=RS·e₂ב־(AB)x המטריצה הימנית B פועלת ראשונה
עקבו מהצורה הראשונית אל התוצאה

ההמחשה משווה את ריבוע היחידה תחת SR — תחילה השתקפות R ואז הטיה S — מול RS, שבו ההטיה פועלת לפני ההשתקפות.

מה כדאי לגלות: עקבו אחר e₂:‏ SR·e₂=(−1,−1) ואילו RS·e₂=(1,−1). ההבדל החזותי מזכיר שבמכפלה AB קוראים את הפעולות מימין לשמאל.

אחרי שראינו

בסוף השיעור תוכלו

  • לבדוק התאמת ממדים ולקבוע את ממדי התוצאה לפני חישוב כלשהו.
  • לחשב כל איבר של AB כמכפלה פנימית של שורה מ־A ועמודה מ־B.
  • להסביר מדוע ב־AB המטריצה B פועלת ראשונה ולוודא A(Bx)=(AB)x.
  • להשתמש בתצוגת העמודות ובסכום מכפלות חיצוניות כדי להבין את מבנה התוצאה.

נותנים שמות למה שראינו

מושגים שנשתמש בהם

ממדי מטריצה
הכתיב m×n מציין m שורות ו־n עמודות; הוא קובע איזה וקטור יכול להיכנס ולאיזה ממד ייצא.
ממדים פנימיים
מספר העמודות של A ומספר השורות של B. המכפלה AB מוגדרת רק כאשר שני המספרים שווים.
מכפלה פנימית
סכום מכפלות של רכיבים תואמים, למשל (a,b)·(c,d)=ac+bd.
מכפלת מטריצות
המטריצה AB שאיבר (i,j) שלה הוא המכפלה הפנימית של שורה i ב־A עם עמודה j ב־B.
הרכבה
ביצוע שתי פעולות בזו אחר זו. ב־AB מפעילים תחילה את B ואחר כך את A.
מטריצת היחידה I
מטריצה ריבועית עם 1 באלכסון ו־0 מחוצה לו; היא משאירה כל וקטור ללא שינוי.
אי־חילופיות
העובדה שבדרך כלל AB≠BA; שינוי סדר הפעולות משנה את התוצאה ולעיתים אחד הסדרים כלל אינו מוגדר.
מכפלה חיצונית
עבור עמודה u ושורה vᵀ, הטבלה uvᵀ מכילה בכל תא את מכפלת רכיב מ־u ברכיב מ־v.

מהמילים אל הסימנים

כותבים את הפעולה שכבר ראינו

פתחו את הנוסחה רק אחרי שאתם יכולים לומר במילים מה כל פעולה אמורה לעשות. בשלב הבא נצדיק אותה צעד אחר צעד.

להצגת נוסחת המפתחקראו כל סימן כפעולה, לא כמשהו שצריך לשנן(AB)ᵢⱼ = Σₖaᵢₖbₖⱼ

מרכיבים את הפעולות

מהתמונה אל הנוסחה — הגזירה, בלי לדלג על הצעדים

  1. בודקים את מסלול הממדים

    אם B מעבירה וקטור מ־ℝᵖ אל ℝⁿ ו־A מקבלת וקטור מ־ℝⁿ ומחזירה וקטור ב־ℝᵐ, אפשר לחבר את שתי הפעולות. לכן A היא m×n,‏ B היא n×p והתוצאה AB היא m×p.

    B: ℝᵖ→ℝⁿ, A: ℝⁿ→ℝᵐ ⇒ AB: ℝᵖ→ℝᵐ
  2. מחשבים תא אחד: שורה מול עמודה

    האיבר במקום (i,j) חייב לתאר כיצד עמודת הקלט j של B תורמת לרכיב הפלט i של A. מכפילים רכיבים תואמים ומחברים.

    (AB)ᵢⱼ=Σₖ aᵢₖbₖⱼ
  3. ממלאים את כל טבלת התוצאה

    לכל שורה של A ולכל עמודה של B מחשבים מכפלה פנימית אחת. מספר הזוגות הוא בדיוק m·p, ולכן מתקבלת מטריצה m×p.

    A_(m×n)B_(n×p)=(AB)_(m×p)
  4. קוראים את העמודות השלמות

    עמודה j של AB היא A כפול עמודה j של B. זו דרך יעילה להבין לאן ההרכבה שולחת כל עמודת קלט בלי לחשב תאים מבודדים.

    B=[b₁ ⋯ bₚ] ⇒ AB=[Ab₁ ⋯ Abₚ]
  5. הכפל הוא הרכבה מימין לשמאל

    כאשר מפעילים AB על x, קודם B בונה את Bx ורק אז A פועלת על התוצאה. בדיקת הממדים מסבירה גם את הסדר וגם את השוויון האסוציאטיבי.

    A(Bx)=(AB)x, (AB)C=A(BC)
  6. הסדר חשוב

    כפל מטריצות הוא אסוציאטיבי ודיסטריבוטיבי, אך אינו חילופי. שתי פעולות גאומטריות בסדר הפוך עשויות לתת תמונות שונות, ולעיתים BA אינו מוגדר אף ש־AB כן.

    A(B+C)=AB+AC, אך בדרך כלל AB≠BA
  7. הרחבה: בונים את AB בשכבות

    אפשר לחבר מכפלות חיצוניות: עמודה k של A כפול שורה k של B יוצרת שכבה אחת, וסכום השכבות הוא AB. זהו מבט מבני נוסף; המושג הפורמלי דרגה יילמד בפרק 5.

    AB=Σₖ aₖrₖ

עכשיו רואים את השיטה בפעולה

דוגמאות פתורות, צעד אחר צעד

דוגמה 1

מכפלה מלבנית מלאה

חשבו AB עבור A=[[1,2,0],[−1,1,3]] ו־B=[[2,0],[1,1],[0,−2]].

  1. A היא 2×3 ו־B היא 3×2. הממדים הפנימיים 3 מתאימים, ולכן AB מוגדרת וגודלה 2×2.

  2. התא (1,1) הוא (1,2,0)·(2,1,0)=4; התא (1,2) הוא (1,2,0)·(0,1,−2)=2.

  3. התא (2,1) הוא (−1,1,3)·(2,1,0)=−1; התא (2,2) הוא (−1,1,3)·(0,1,−2)=−5.

  4. בודקים גם לפי עמודות: העמודות של AB הן A(2,1,0)ᵀ ו־A(0,1,−2)ᵀ.

התוצאה ומה היא אומרת

כל תא הוא שורה מול עמודה, והממדים החיצוניים קובעים טבלה 2×2.

AB=[[4,2],[−1,−5]]
דוגמה 2

אותן פעולות בסדר שונה

עבור S=[[1,1],[0,1]] ו־R=[[1,0],[0,−1]], השוו בין SR ובין RS על e₂=(0,1).

  1. מחשבים SR=[[1,−1],[0,−1]] ו־RS=[[1,1],[0,−1]].

  2. ב־SR הווקטור פוגש תחילה את R:‏ e₂ נהפך ל־(0,−1), ואז S שולחת אותו ל־(−1,−1).

  3. ב־RS הווקטור פוגש תחילה את S:‏ e₂ נהפך ל־(1,1), ואז R שולחת אותו ל־(1,−1).

  4. שתי התוצאות שונות, ולכן שינוי סדר ההרכבה משנה את הפעולה.

התוצאה ומה היא אומרת

כפל מטריצות אינו חילופי משום שגם סדר הפעולות הגאומטריות אינו חילופי.

SR·e₂=(−1,−1), RS·e₂=(1,−1)

איפה זה פוגש את העולם

יישום

בגרפיקה ממוחשבת אפשר לתת ל־B לשנות קנה מידה ול־A לסובב. עמודות AB מראות היכן נוחתים וקטורי הבסיס לאחר שתי הפעולות, ושינוי הסדר משנה את הצורה.

מלכודת נפוצה

מה כדאי לבדוק

להכפיל איבר מול איבר או להעביר את חוקי הכפל של מספרים ישירות למטריצות. כפל Hadamard הוא פעולה אחרת; בכפל מטריצות בודקים ממדים פנימיים וזוכרים שהמטריצה הימנית פועלת ראשונה.

בודקים שהרעיון יושב

תרגול ומשוב

בדיקת הבנה

בחרו תשובה ורק אז בדקו את עצמכם

אם A היא 4×3 ו־B היא 3×2, איזו קביעה נכונה?

בחרו אחת מהאפשרויות כדי להמשיך.

עכשיו אתם

אתגר קצר

נתונות רק המידות A:‏ 2×3,‏ B:‏ 3×2 ו־C:‏ 2×4. קבעו אילו מן הביטויים AB,‏ BA,‏ AC,‏ CA,‏ (AB)C ו־A(BC) מוגדרים, ומה מידת כל תוצאה מוגדרת.

רמז ראשון

בכל מכפלה בדקו קודם את שני הממדים שנפגשים באמצע. בביטוי תלת־מטריצי חשבו תחילה את מידת הסוגריים ואז בדקו את המכפלה השנייה.

הצגת דרך הפתרון
  1. AB מוגדרת: (2×3)(3×2) נותן 2×2. גם BA מוגדרת: (3×2)(2×3) נותן 3×3.
  2. AC אינה מוגדרת כי 3≠2; גם CA אינה מוגדרת כי 4≠2.
  3. (AB)C מוגדרת: AB היא 2×2, ולכן (2×2)(2×4) נותן 2×4.
  4. BC היא 3×4, ולכן A(BC) היא (2×3)(3×4), גם כן 2×4. כאשר הערכים עצמם נתונים, האסוציאטיביות מבטיחה ששתי דרכי הקיבוץ נותנות אותה מטריצה.

מימוש הנושא

קוד שאפשר לקחת לניסוי

הקוד מיישם את אותו רעיון מתמטי. ב־JavaScript אפשר להריץ אותו כאן; גרסת Python זמינה להשוואה ולהעתקה.

הקשר למתמטיקה

multiplicationViews מחשבת את אותה תוצאה לפי תאים, לפי עמודות, לפי שורות ולפי שכבות חיצוניות; אחר כך הקוד משווה בין הפעלה ישירה להרכבה.

פלט צפוי

כל ארבע התצוגות יחזירו [[4,2],[−1,−5]], והווקטורים direct ו־composed יהיו זהים.

ניסוי המשך

החליפו בין A ל־B ובדקו את BA. השוו את הממדים ואת הערכים ל־AB והסבירו מדוע אין סיבה שיהיו שווים.

מהרעיון אל הקוד

מימוש חישובי

function shape(M, name="matrix") {
  if (!Array.isArray(M) || !M.length || !Array.isArray(M[0]) || !M[0].length) {
    throw new TypeError(name + " must be a nonempty matrix");
  }
  const columns = M[0].length;
  if (!M.every((row) =>
    Array.isArray(row) &&
    row.length === columns &&
    row.every(Number.isFinite))) {
    throw new TypeError(name + " must be rectangular and numeric");
  }
  return [M.length, columns];
}

function matmul(A, B) {
  const [m, n] = shape(A, "A");
  const [rows, p] = shape(B, "B");
  if (n !== rows) {
    throw new RangeError(
      "inner dimensions differ: " + m + "x" + n +
      " times " + rows + "x" + p,
    );
  }
  return A.map((row) =>
    Array.from({ length: p }, (_, j) =>
      row.reduce((sum, value, k) => sum + value*B[k][j], 0),
    ),
  );
}

function outer(u, v) {
  return u.map((x) => v.map((y) => x*y));
}

function multiplicationViews(A, B) {
  const [m, n] = shape(A, "A");
  const [rows, p] = shape(B, "B");
  if (n !== rows) throw new RangeError("inner dimensions must agree");

  const byEntries = matmul(A, B);
  const productColumns = Array.from({ length: p }, (_, j) =>
    matmul(A, B.map((row) => [row[j]])).map((row) => row[0]),
  );
  const byColumns = Array.from(
    { length: m },
    (_, i) => productColumns.map((column) => column[i]),
  );
  const byRows = A.map((row) => matmul([row], B)[0]);
  const byOuter = Array.from({ length: m }, () => Array(p).fill(0));

  for (let k = 0; k < n; k += 1) {
    const piece = outer(A.map((row) => row[k]), B[k]);
    for (let i = 0; i < m; i += 1) {
      for (let j = 0; j < p; j += 1) byOuter[i][j] += piece[i][j];
    }
  }
  return { byEntries, byColumns, byRows, byOuter };
}

const A = [[1, 2, 0], [-1, 1, 3]];
const B = [[2, 0], [1, 1], [0, -2]];
const views = multiplicationViews(A, B);
const expected = JSON.stringify(views.byEntries);
if (!Object.values(views).every((view) => JSON.stringify(view) === expected)) {
  throw new Error("the four multiplication views must agree");
}
console.log(views);

const x = [[3], [-1]];
console.log({
  direct: matmul(matmul(A, B), x),
  composed: matmul(A, matmul(B, x)),
});

לפני שממשיכים

מה לוקחים מהשיעור

  • בודקים ממדים לפני שמכפילים: הפנימיים חייבים להתאים והחיצוניים קובעים את התוצאה.
  • כל איבר ב־AB הוא מכפלה פנימית של שורה ב־A ועמודה ב־B.
  • ב־AB פועלת B ראשונה; לכן הסדר מייצג סדר הרכבה ממשי ואי אפשר להחליפו כרצוננו.
  • תצוגת העמודות והמכפלות החיצוניות הן דרכים נוספות לקרוא את אותה מכפלה, לא פעולות חדשות.

משימת מעבדה לשיעור הזה

תחנה 3 — הרכבה וסדר פעולות

בחרו שתי העתקות, נבאו את מסלול הממדים ואת סדר הפעולה, והשוו חזותית בין AB,‏ BA ובין הפעלה צעד אחר צעד.

לפתיחת התחנה
מקורות להעמקה בלבד — השיעור עומד בפני עצמו

מדריך המרצים: עמ׳ 110–117

ספר הלימוד: עמ׳ 219–227