Podstawowe operacje na macierzach
Część sekcji Logika i sterowanie przepływem ścieżki C# w Coddy. Lekcja 6 z 66.
Macierze są powszechnie używane w matematyce i informatyce. Przyjrzyjmy się kilku typowym operacjom na tablicach dwuwymiarowych.
Dodaj do siebie dwie macierze:
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;
}Transponuj macierz (zamień wiersze i kolumny):
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;
}Oblicz sumę każdego wiersza:
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;
}Pomnóż przez siebie dwie macierze:
W mnożeniu macierzy każdy element result[i][j] oblicza się, biorąc wiersz i z pierwszej macierzy i kolumnę j z drugiej macierzy, mnożąc odpowiadające sobie elementy i sumując iloczyny. Formalnie: result[i][j] = sum of matrix1[i][k] * matrix2[k][j] dla wszystkich prawidłowych wartości k.
Aby to zadziałało, liczba kolumn w matrix1 musi być równa liczbie wierszy w matrix2. Wynikowa macierz ma wymiary [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;
}Wyzwanie
TrudnyUtwórz metodę o nazwie multiplyMatrices, która:
- Przyjmuje dwie macierze (poszarpane tablice 2D) jako parametry: matrix1 i matrix2
- Mnoży je zgodnie z zasadami mnożenia macierzy
- Zwraca wynikową macierz
Aby mnożenie macierzy było poprawne:
- Liczba kolumn w matrix1 musi być równa liczbie wierszy w matrix2
- Wynik będzie miał wymiary: [matrix1.rows × matrix2.columns]
Jak działa mnożenie macierzy:
Każdy element na pozycji [i][j] w wyniku oblicza się, biorąc wiersz i z matrix1 i kolumnę j z matrix2, mnożąc odpowiadające sobie elementy i sumując wszystkie te iloczyny:result[i][j] = matrix1[i][0] * matrix2[0][j] + matrix1[i][1] * matrix2[1][j] + ...
Innymi słowy: result[i][j] = sum of (matrix1[i][k] * matrix2[k][j]) dla każdego k.
Na przykład, jeśli matrix1 ma postać:
[1, 2]
[3, 4]A matrix2 ma postać:
[5, 6]
[7, 8]Wtedy result[0][0] = 1*5 + 2*7 = 19, result[0][1] = 1*6 + 2*8 = 22 i tak dalej. Wynik powinien mieć postać:
[19, 22]
[43, 50]Jeśli macierzy nie można pomnożyć, zwróć null.
Spróbuj swoich sił
public class MultiplyMatrices
{
// Zaimplementuj metodę MultiplyMatrices
public static int[][] multiplyMatrices(int[][] matrix1, int[][] matrix2)
{
// Wpisz tutaj swój kod
}
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i sterowanie przepływem
1Tablice wielowymiarowe
Podstawy tablic 2DDeklarowanie i inicjalizacja tablic 2DDostęp do elementów tablic 2DZagnieżdżone pętle z tablicami 2DTablice postrzępionePodstawowe operacje na macierzachPodsumowanie — tablice wielowymiarowe4Techniki sterowania przepływem
Wczesne zwrotyKlauzule ochronneInstrukcje skoku (goto)Break i continueSpłaszczanie zagnieżdżonych warunków7Zaawansowane operatory logiczne
Ewaluacja z krótkim spięciemWarunkowe operatory logicznePriorytet operatorówPowtórzenie — zaawansowane operatory2Zaawansowane podejmowanie decyzji
Wiele warunkówZłożona logika Boole’aPorównanie if i switchZagnieżdżone instrukcje switchPodsumowanie — zaawansowane decyzje5Obsługa wyjątków
Podstawy try-catchTypy wyjątkówWiele bloków catchPraca z plikamiBlok finallyusing a try-finallyWłasne wyjątkiPowtórzenie — obsługa błędów3Udoskonalenia pętli
Wydajność pętliIterowanie po złożonych strukturachKażdy typ pętliRefaktoryzacja pętliPodsumowanie — zoptymalizowane pętle6Obsługa wartości null
Podstawy referencji nullTypy wartości dopuszczające nullWzorce sprawdzania nullProgramowanie defensywnePodsumowanie — bezpieczeństwo nullPoćwicz samodzielnie: Kompilator C# online