פעולות מטריצה נפוצות
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C# של Coddy. שיעור 6 מתוך 66.
מטריצות נפוצות במתמטיקה ובמדעי המחשב. בואו נחקור כמה פעולות נפוצות על מערכים דו־ממדיים.
חברו שתי מטריצות:
int[][] AddMatrices(int[][] a, int[][] b)
{
int rows = a.Length;
int[][] result = new int[rows][];
for (int i = 0; i < rows; i++)
{
result[i] = new int[a[i].Length];
for (int j = 0; j < a[i].Length; j++)
{
result[i][j] = a[i][j] + b[i][j];
}
}
return result;
}שחלוף מטריצה (החלפת שורות ועמודות):
int[][] Transpose(int[][] matrix)
{
int rows = matrix.Length;
int cols = matrix[0].Length;
int[][] result = new int[cols][];
for (int i = 0; i < cols; i++)
{
result[i] = new int[rows];
for (int j = 0; j < rows; j++)
{
result[i][j] = matrix[j][i];
}
}
return result;
}חשב את הסכום של כל שורה:
int[] RowSums(int[][] matrix)
{
int rows = matrix.Length;
int[] sums = new int[rows];
for (int i = 0; i < rows; i++)
{
int sum = 0;
for (int j = 0; j < matrix[i].Length; j++)
{
sum += matrix[i][j];
}
sums[i] = sum;
}
return sums;
}הכפל שתי מטריצות זו בזו:
בכפל מטריצות, כל איבר result[i][j] מחושב על ידי לקיחת שורה i מהמטריצה הראשונה ועמודה j מהמטריצה השנייה, הכפלת האיברים המתאימים שלהן וסכימת המכפלות. בניסוח פורמלי: result[i][j] = sum of matrix1[i][k] * matrix2[k][j] עבור כל הערכים התקפים של k.
כדי שזה יעבוד, מספר העמודות ב-matrix1 חייב להיות שווה למספר השורות ב-matrix2. למטריצה המתקבלת יש ממדים [matrix1.rows × matrix2.cols].
int[][] MultiplyMatrices(int[][] a, int[][] b)
{
int rows = a.Length;
int cols = b[0].Length;
int inner = b.Length;
int[][] result = new int[rows][];
for (int i = 0; i < rows; i++)
{
result[i] = new int[cols];
for (int j = 0; j < cols; j++)
{
int sum = 0;
for (int k = 0; k < inner; k++)
{
sum += a[i][k] * b[k][j];
}
result[i][j] = sum;
}
}
return result;
}אתגר
קשהצרו מתודה בשם multiplyMatrices ש:
- מקבלת שתי מטריצות (מערכים משוננים דו־ממדיים) כפרמטרים: matrix1 ו-matrix2
- מכפילה אותן בהתאם לכללי כפל מטריצות
- מחזירה את המטריצה המתקבלת
כדי שכפל מטריצות יהיה תקין:
- מספר העמודות ב-matrix1 חייב להיות שווה למספר השורות ב-matrix2
- ממדי התוצאה יהיו: [matrix1.rows × matrix2.columns]
איך עובד כפל מטריצות:
כל איבר במיקום [i][j] בתוצאה מחושב על ידי לקיחת שורה i מתוך matrix1 ועמודה j מתוך matrix2, הכפלת האיברים המתאימים שלהן זה בזה וחיבור כל המכפלות:result[i][j] = matrix1[i][0] * matrix2[0][j] + matrix1[i][1] * matrix2[1][j] + ...
במילים אחרות: result[i][j] = sum of (matrix1[i][k] * matrix2[k][j]) עבור כל k.
לדוגמה, אם matrix1 היא:
[1, 2]
[3, 4]ו-matrix2 היא:
[5, 6]
[7, 8]אז result[0][0] = 1*5 + 2*7 = 19, result[0][1] = 1*6 + 2*8 = 22, וכן הלאה. התוצאה צריכה להיות:
[19, 22]
[43, 50]אם לא ניתן להכפיל את המטריצות, החזירו null.
נסו בעצמכם
public class MultiplyMatrices
{
// ממשו את המתודה MultiplyMatrices
public static int[][] multiplyMatrices(int[][] matrix1, int[][] matrix2)
{
// כתבו כאן את הקוד שלכם
}
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מערכים רב־ממדיים
יסודות מערכים דו־ממדייםהכרזה ואתחול של מערכים דו־ממדייםגישה לאיברי מערך דו־ממדילולאות מקוננות עם מערכים דו־ממדייםמערכים משונניםפעולות מטריצה נפוצותחזרה – מערכים רב־ממדיים7אופרטורים לוגיים מתקדמים
הערכה בקיצור דרךאופרטורים לוגיים מותניםקדימות אופרטוריםסיכום – אופרטורים מתקדמים2קבלת החלטות מתקדמת
תנאים מרוביםלוגיקה בוליאנית מורכבתהשוואה בין If ל-Switchהצהרות Switch מקוננותסיכום — קבלת החלטות מתקדמת5טיפול בחריגות
יסודות try-catchסוגי חריגותבלוקי catch מרוביםעבודה עם קבציםבלוק finallyשימוש ב-using לעומת try-finallyחריגות מותאמות אישיתסיכום – טיפול בשגיאות3שיפורים בלולאות
ביצועי לולאותאיטרציה במבנים מורכביםכל אחד מסוגי הלולאותרפקטורינג של לולאותסיכום – לולאות שעברו אופטימיזציה6טיפול בערכי Null
יסודות הפניה ל-Nullטיפוסי ערכים שניתנים ל-Nullדפוסי בדיקת Nullתכנות הגנתיסיכום – בטיחות מול Nullתרגלו בעצמכם: קומפיילר C# אונליין