Транспонирование матриц: примеры на C++, Python, JavaScript и C

Условие задачи
Дана матрица mat[][]. Требуется найти и вывести её транспонированную матрицу.
Пример:
Короткая интуиция
Транспонирование меняет порядок матрицы: строки исходной становятся столбцами результата и наоборот. Для элемента mat[i][j] транспонированная матрица содержит transpose[j][i].
Важно: для квадратной матрицы размер остаётся тем же; для прямоугольной m×n транспонированная будет n×m.
Как найти транспонированную матрицу (общая методика)
Шаги:
- Выделите матрицу результатов с размерами (cols × rows).
- Для каждой позиции i (0..cols-1) и j (0..rows-1) присвойте transpose[i][j] = mat[j][i].
- Выведите/верните результат.
Краткая методика (мини‑плейбук):
- Проверить размеры исходной матрицы.
- Если нужна память «в‑месте», оценить, квадратная ли матрица.
- Применить двойной цикл с обменом индексов.
Транспонирование прямоугольной матрицы
Правила:
- Порядок транспонированной матрицы обратен: m×n → n×m.
- Каждая колонка исходной становится строкой результата: transpose[i][j] = mat[j][i].
C++ пример для прямоугольной матрицы
Ниже — оригинальная программа на C++ для транспонирования прямоугольной матрицы:
// C++ program to find the transpose of a rectangular Matrix
#include
using namespace std;
// The order of the initial matrix is 3 x 4
#define size1 3
#define size2 4
// Function to transpose a Matrix
void transposeMatrix(int mat[][size2], int transposeMatrix[][size1])
{
for (int i=0; i Вывод программы:
Initial Matrix:
4 2 8 2
9 7 1 9
0 2 7 5
Transposed Matrix:
4 9 0
2 7 2
8 1 7
2 9 5Python пример для прямоугольной матрицы
Оригинальная реализация на Python:
# Python program to find the transpose of a rectangular Matrix
# The order of the initial matrix is 3 x 4
size1 = 3
size2 = 4
# Function to transpose a Matrix
def transposeMatrix(mat, transposedMatrix):
for i in range(size2):
for j in range(size1):
transposedMatrix[i][j] = mat[j][i]
# Driver Code
mat = [ [4, 2, 8, 2],
[9, 7, 1, 9],
[0, 2, 7, 5] ]
print("Initial Matrix:")
# Printing the initial Matrix
for i in range(size1):
for j in range(size2):
print(mat[i][j], end=' ')
print()
# Variable to store the transposed Matrix
# The dimensions of transposedMatrix are opposite to that of mat
transposedMatrix = [[0 for x in range(size1)] for y in range(size2)]
transposeMatrix(mat, transposedMatrix)
print("Transposed Matrix:")
# Printing the transposed Matrix
for i in range(size2):
for j in range(size1):
print(transposedMatrix[i][j], end=' ')
print()
Вывод такой же, как в C++ примере выше.
JavaScript пример для прямоугольной матрицы
Оригинальный пример на JavaScript:
// JavaScript program to find the transpose of a rectangular Matrix
// The order of the initial matrix is 3 x 4
var size1 = 3
var size2 = 4
// Function to transpose a Matrix
function transposeMatrix(mat, transposeMatrix) {
for (let i=0; iC пример для прямоугольной матрицы
Оригинальный пример на C:
// C program to find the transpose of a rectangular Matrix
#include
// The order of the initial matrix is 3 x 4
#define size1 3
#define size2 4
// Function to transpose a Matrix
void transposeMatrix(int mat[][size2], int transposeMatrix[][size1])
{
for (int i=0; i Транспонирование квадратной матрицы
Особенность:
- Порядок остаётся тем же (n×n).
- Для квадратной матрицы можно сделать ин‑плейс транспонирование, меняя элементы относительно главной диагонали: для всех i
C++ пример для квадратной матрицы
// C++ program to find the transpose of a square matrix
#include
using namespace std;
// The order of the matrix is 3 x 3
#define size 3
// Function to transpose a Matrix
void transposeMatrix(int mat[][size], int transposeMatrix[][size])
{
for (int i=0; i Другие реализации для Python, JavaScript и C для квадратной матрицы в статье выше используют ту же идею (transpose[i][j] = mat[j][i]).
Когда простое транспонирование не подходит
Контрпримеры / ограничения:
- Ин‑плейс транспонирование возможно только для квадратных матриц простым обменом по диагонали. Для прямоугольных понадобится выделить новую память или сложная перестановка индексов.
- Для больших матриц, хранящихся во внешней памяти (файлы, БД), необходимо учитывать расположение блоков (cache/IO), чтобы избежать многократных чтений/записей.
- Транспонирование не меняет структуру значений (например, типы), но может требовать преобразования в стрим‑формате при сериализации.
Альтернативные подходы:
- Использовать библиотечные функции (NumPy: mat.T) для оптимизированного выполнения и кеширования.
- Для очень больших матриц применять блочное транспонирование: делить на подматрицы, транспонировать блоки и записывать.
Ментальные модели и эвристики
- Представьте таблицу в Excel: транспонирование — это поворот таблицы через главную диагональ.
- Для in‑place: меняем только элементы над диагональю (i
- Для прямоугольной матрицы думайте о «повороте бумаги»: ширина становится высотой.
Фактбокс:
- Транспонирование сохраняет ранг матрицы и след (trace) для квадратных матриц.
- Детеминант транспонированной матрицы равен детерминанту исходной.
Проверочный список перед использованием в задаче или на интервью
Для разработчика:
- Убедиться в корректных размерах: rows и cols.
- Выбрать in‑place только для квадратной матрицы.
- Проверить границы циклов (i от 0 до cols-1, j от 0 до rows-1 для результирующей).
- Написать тесты: пустая матрица, матрица 1×1, прямоугольная 1×n и n×1, случайные.
Для интервьюируемого:
- Объяснить сложность по времени O(n·m) и по памяти O(1) для in‑place (квадратные) или O(n·m) для выделения новой матрицы.
- Уметь привести пример блочного алгоритма для больших данных.
Критерии приёмки
- Результат соответствует transpose[i][j] = mat[j][i] для всех корректных индексов.
- Для квадратного in‑place проверены все пары i
- Тесты на граничные случаи пройдены.
Примеры тестов и критерии приёмки
Тесты:
- mat = [] → transpose = []
- mat = [[5]] → transpose = [[5]]
- mat = [[1,2,3]] (1×3) → transpose = [[1],[2],[3]] (3×1)
- Случайная матрица 100×200 → ожидаемый размер 200×100 и корректные значения.
Резюме
- Транспонирование меняет местами строки и столбцы: transpose[i][j] = mat[j][i].
- Для квадратных матриц можно сделать in‑place, меняя элементы относительно диагонали; для прямоугольных нужно выделять новую матрицу или применять более сложные схемы перестановок.
- В практических задачах учитывайте объём данных и используйте блочное транспонирование или специализированные библиотеки для производительности.
Важно: прежде чем оптимизировать, убедитесь, что базовый алгоритм корректен и покрыт тестами.
Краткие выводы:
- Алгоритмическая сложность: O(n·m).
- Память: O(1) для in‑place (только квадратные), иначе O(n·m).
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone