Транспонирование матрицы на C и C++
В этом уроке вы выведете транспонированную матрицу, поменяв местами роли строк и столбцов.
Введение
Транспонировать матрицу значит превратить строки в столбцы, а столбцы в строки: значение из строки i и столбца j переходит в строку j и столбец i. Матрица из 2 строк и 3 столбцов после транспонирования становится матрицей из 3 строк и 2 столбцов.
Главное
- Включите предупреждения компилятора (compiler warnings) и исправьте их все.
- Хорошо понимайте тип и время жизни (lifetime) каждого значения.
- Всегда проверяйте входные данные и границы индексов массивов.
Как это работает
Нажмите transpose, чтобы поменять строки и столбцы местами. Наведите на ячейку, чтобы увидеть её новую позицию и смещение в памяти.
Примеры кода на C и C++
#include <stdio.h>
int main(void) {
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
// Visit columns first to print the transposed shape.
for (int column = 0; column < 3; ++column) { for (int row = 0; row < 2; ++row) printf("%s%d", row ? " " : "", matrix[row][column]); puts(""); }
}
1 4
2 5
3 6
#include <array>
#include <iostream>
int main() {
std::array<std::array<int, 3>, 2> matrix{{{{1, 2, 3}}, {{4, 5, 6}}}};
// Visit columns first to print the transposed shape.
for (size_t column = 0; column < 3; ++column) { for (size_t row = 0; row < 2; ++row) std::cout << (row ? " " : "") << matrix[row][column]; std::cout << '\n'; }
}
1 4
2 5
3 6
Сравнение C и C++
Вместо создания новой матрицы программа меняет порядок двух циклов: внешний цикл проходит по столбцам, а внутренний по строкам. Поэтому каждый столбец исходной матрицы выводится как строка, и получается 1 4, 2 5 и 3 6.
C использует небольшие процедурные функции и открыто показывает, как данные представлены в памяти.
C++ по-прежнему позволяет работать на низком уровне, но добавляет библиотечные типы и более безопасные абстракции.
Упражнения для практики
Запустите обе версии, а затем измените код, чтобы увидеть разницу в безопасности, которую даёт каждый язык.
- Проверьте неверный ввод и граничные значения.
- Скомпилируйте с флагами -Wall -Wextra -Wpedantic, чтобы включить больше предупреждений.
- Вынесите общие объявления в заголовочный файл, а реализацию в отдельный файл.
Попрактикуйтесь на задаче
Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.
- Row Sums Add up every row of a grid. Легко
- Умножение матриц Перемножьте две матрицы — эта операция стоит за каждым слоем нейронной сети. Легко