Основные операции с матрицами
Часть раздела Логика и управление потоком путешествия по 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Многомерные массивы
Основы 2D-массивовОбъявление и инициализация 2D-массивовДоступ к элементам 2D-массиваВложенные циклы с 2D-массивамиЗубчатые массивыОсновные операции с матрицамиПовторение — многомерные массивы4Методы управления потоком выполнения
Досрочный выходЗащитные условияОператоры перехода (goto)Break и ContinueУпрощение вложенных условных конструкций7Логические операторы: продвинутый уровень
Вычисление с коротким замыканиемУсловные логические операторыПриоритет операторовПовторение — продвинутые операторы2Продвинутое принятие решений
Множественные условияСложная логика BooleanСравнение If и SwitchВложенные конструкции SwitchПовторение — продвинутые решения5Обработка исключений
Основы Try-CatchТипы исключенийНесколько блоков CatchРабота с файламиБлок FinallyИспользование Using вместо Try-FinallyПользовательские исключенияПовторение — обработка ошибок3Улучшение циклов
Производительность цикловИтерация по сложным структурамКаждый тип циклаРефакторинг цикловПовторение — оптимизированные циклы6Обработка null
Основы ссылок на nullТипы значений, допускающие nullШаблоны проверки на nullЗащитное программированиеПовторение — безопасность при работе с nullПотренируйтесь самостоятельно: Онлайн-компилятор C#