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 из второй матрицы, умножения их соответствующих элементов и суммирования полученных произведений. Формально: 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)
{
// Напишите свой код здесь
}
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
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