Common Matrix Operations
Часть раздела Логика и управление потоком путешествия по 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 из второй матрицы — то есть сумма matrix1[i][k] * matrix2[k][j] для каждого k. Первая матрица должна иметь столько же столбцов, сколько строк имеет вторая матрица.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, который:
- Принимает две матрицы (2D jagged arrays) в качестве параметров: 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.
Шпаргалка
Распространённые операции с матрицами с использованием 2D рваными массивов:
Сложить две матрицы:
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] += matrix1[i][k] * matrix2[k][j] для каждого k.
Первая матрица должна иметь столько же столбцов, сколько строк во второй матрице.
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++)
{
for (int k = 0; k < inner; k++)
{
result[i][j] += a[i][k] * b[k][j];
}
}
}
return result;
}Попробуйте сами
public class MultiplyMatrices
{
// Реализуйте метод MultiplyMatrices
public static int[][] multiplyMatrices(int[][] matrix1, int[][] matrix2)
{
// Напишите свой код здесь
}
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Multi-dimensional Arrays
2D Arrays BasicsDeclaring and Initializing 2DAccessing 2D Array ElementsNested Loops with 2D ArraysJagged ArraysCommon Matrix OperationsRecap - Multi-dimensional4Flow Control Techniques
Early ReturnsGuard ClausesJump Statements (goto)Break and ContinueFlatten Nested Conditionals7Logical Operators Advanced
Short-Circuit EvaluationConditional Logical OperatorsOperator PrecedenceRecap - Advanced Operators2Advanced Decision Making
Multiple ConditionsComplex Boolean LogicIf vs. Switch ComparisonNested Switch StatementsRecap - Advanced Decisions5Exception Handling
Try-Catch BasicsException TypesMultiple Catch BlocksWorking with FilesFinally BlockUsing vs. Try-FinallyCustom ExceptionsRecap - Error Handling3Loop Enhancements
Loop PerformanceIterating ComplexEach Loop TypeRefactoring LoopsRecap - Optimized Loops6Null Handling
Null Reference BasicsNullable Value TypesNull Checking PatternsDefensive ProgrammingRecap - Null Safety