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

Что такое транспонирование (кратко)
Транспонирование матрицы — это простая линейная операция: новая матрица строится так, что строки исходной становятся столбцами новой. Формально: B = A^T, где B[i][j] = A[j][i].
Короткое определение: транспонирование — перестановка индексов строк и столбцов.
Important: индексирование в коде обычно начинается с 0. Всегда проверяйте размеры перед обращением к элементам.
Примеры и задача
В задаче дана матрица mat[][]. Нужно найти и вывести её транспонированную матрицу.
Интуитивное правило
- Для прямоугольной матрицы размером rows × cols транспонированная будет иметь размер cols × rows.
- Для каждой пары индексов: transpose[i][j] = mat[j][i].
Транспонирование прямоугольной матрицы: объяснение и примеры
Алгоритм простой и детерминированный:
- Создайте пустую матрицу размера cols × rows.
- Для i от 0 до cols-1 и j от 0 до rows-1 присвойте transpose[i][j] = mat[j][i].
- Выведите результат.
Сложность: O(rows cols) по времени и O(rows cols) по дополнительной памяти (если хранить новую матрицу).
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 < size2; i++)
{
for (int j = 0; j < size1; j++)
{
transposeMatrix[i][j] = mat[j][i];
}
}
}
// Driver Code
int main()
{
int mat[size1][size2] = { {4, 2, 8, 2},
{9, 7, 1, 9},
{0, 2, 7, 5} };
cout << "Initial Matrix:" << endl;
// Printing the initial Matrix
for (int i = 0; i < size1; i++)
{
for (int j = 0; j < size2; j++)
{
cout << mat[i][j] << " ";
}
cout << endl;
}
int transposedMatrix[size2][size1];
transposeMatrix(mat, transposedMatrix);
cout << "Transposed Matrix:" << endl;
// Printing the transposed Matrix
for (int i = 0; i < size2; i++)
{
for (int j = 0; j < size1; j++)
{
cout << transposedMatrix[i][j] << " ";
}
cout << endl;
}
return 0;
} Output:
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 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
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()Output:
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 5JavaScript: транспонирование прямоугольной матрицы
// 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; i < size2; i++) {
for (let j = 0; j < size1; j++) {
transposeMatrix[i][j] = mat[j][i];
}
}
}
// Driver Code
var mat = [ [4, 2, 8, 2],
[9, 7, 1, 9],
[0, 2, 7, 5] ];
// Printing the initial Matrix
console.log('Initial Matrix:');
for (let i = 0; i < size1; i++) {
console.log(mat[i].join(' '));
}
var transposedMatrix = new Array(size2);
for (let k = 0; k < size2; k++) {
transposedMatrix[k] = new Array(size1);
}
transposeMatrix(mat, transposedMatrix);
console.log('Transposed Matrix:');
for (let i = 0; i < size2; i++) {
console.log(transposedMatrix[i].join(' '));
}Output (консоль):
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 5C: транспонирование прямоугольной матрицы
// 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 < size2; i++)
{
for (int j = 0; j < size1; j++)
{
transposeMatrix[i][j] = mat[j][i];
}
}
}
// Driver Code
int main()
{
int mat[size1][size2] = { {4, 2, 8, 2},
{9, 7, 1, 9},
{0, 2, 7, 5} };
printf("Initial Matrix:\n");
// Printing the initial Matrix
for (int i = 0; i < size1; i++)
{
for (int j = 0; j < size2; j++)
{
printf("%d ", mat[i][j]);
}
printf("\n");
}
int transposedMatrix[size2][size1];
transposeMatrix(mat, transposedMatrix);
printf("Transposed Matrix:\n");
// Printing the transposed Matrix
for (int i = 0; i < size2; i++)
{
for (int j = 0; j < size1; j++)
{
printf("%d ", transposedMatrix[i][j]);
}
printf("\n");
}
return 0;
} Output:
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 5Транспонирование квадратной матрицы
Особенность квадратной матрицы (n × n) — её транспонированная матрица имеет тот же порядок. Это даёт возможность выполнить транспонирование «на месте» (без дополнительной O(n^2) памяти) путём попарного обмена элементов выше/ниже главной диагонали.
Правило «на месте»: для i от 0 до n-1 и j от i+1 до n-1 выполнить swap(mat[i][j], mat[j][i]).
Сложность: O(n^2) по времени и O(1) по дополнительной памяти (если менять на месте).
Пример на C++ (квадратная матрица, in-place)
// C++ in-place transpose of a square matrix
#include
using namespace std;
#define size 3
int main() {
int mat[size][size] = { {4, 2, 8}, {9, 7, 1}, {0, 2, 7} };
cout << "Initial Matrix:" << endl;
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) cout << mat[i][j] << " ";
cout << endl;
}
for (int i = 0; i < size; ++i) {
for (int j = i + 1; j < size; ++j) {
swap(mat[i][j], mat[j][i]);
}
}
cout << "Transposed Matrix:" << endl;
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) cout << mat[i][j] << " ";
cout << endl;
}
return 0;
} Когда транспонирование «не работает» и подводные камни
- Неровные строки (рваная структура): если данные представлены как массив указателей с разной длиной строк, простой алгоритм может выйти за пределы.
- Попытка in-place транспонирования на прямоугольной матрице приведёт к потере данных; in-place безопасно только для квадратных матриц.
- Большие матрицы: при ограниченной памяти создавайте транспонированный файл-поток или используйте блочное (blocked) транспонирование для сохранения кеша.
Альтернативные подходы и библиотеки
- Python: используйте zip(*mat) или numpy.transpose для удобства и скорости (если допустима установка пакета).
- C++: применяйте std::vector и динамическое выделение, либо Eigen/Armadillo для линейной алгебры.
- JavaScript (браузер): используйте map и reduce, либо TypedArray для числовых матриц.
Пример Python (короткий):
# быстрое транспонирование с zip
mat = [[4,2,8,2],[9,7,1,9],[0,2,7,5]]
transposed = [list(row) for row in zip(*mat)]Мини-методология: пошаговый план для реализации
- Проверить размеры матрицы: rows и cols.
- Если rows == 0 или cols == 0 — вернуть пустую матрицу.
- Если rows == cols — решить, делать in-place или выделить новую память.
- Реализовать и протестировать на малых примерах.
- Добавить тесты на пограничные случаи, профилировать при больших данных.
Чек-лист для приёмки кода
- Работает на квадратных и прямоугольных матрицах.
- Обрабатывает пустые матрицы и единичные строки/столбцы.
- Нет выхода за пределы массива (проверены индексы).
- Для in-place — подтверждена корректность для квадратной матрицы.
- Тестовые случаи покрыты (см. ниже).
Тестовые случаи (приёмочные тесты)
- Пустая матрица [] → []
- Матрица 1×1 → сама себе
- Матрица 1×n и n×1
- Прямоугольная 3×4 (пример в статье)
- Квадратная матрица с отрицательными и нулевыми значениями
- Очень большая матрица (проверка памяти и времени)
Быстрые эвристики и ментальные модели
- Модель: представьте таблицу Excel — транспонирование — это повернуть таблицу через главную диагональ.
- Эвристика производительности: при больших матрицах блоковое транспонирование даёт лучший кеш-локалити.
Глоссарий (1 строка)
- Транспонирование: операция, меняющая местами строки и столбцы матрицы (B[i][j] = A[j][i]).
Итог и рекомендации
Транспонирование — простая и частая операция в программировании и анализе данных. Для практических задач используйте стандартные библиотеки (numpy, Eigen) когда нужна производительность и удобство. Если реализуете вручную — учитывайте форму матрицы (квадратная vs прямоугольная), границы и требования к памяти.
Summary:
- Транспонирование меняет индексы: (i, j) → (j, i).
- Для прямоугольной матрицы выделяется новая матрица размера cols × rows.
- Для квадратной матрицы можно выполнить изменение на месте.
Related: How to Find the LCM and GCD of Two Numbers in Multiple Languages
Related: How to Swap Two Variables in C++, Python, and JavaScript
Related: How to Find the Sum of Natural Numbers Using Recursion
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента