Гид по технологиям

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

• 4 min read • Программирование • Обновлено 22 Nov 2025
Транспонирование матрицы на C++, Python, JS и C
Транспонирование матрицы на C++, Python, JS и C

Ноутбук с матрицей на экране

Что такое транспонирование (кратко)

Транспонирование матрицы — это простая линейная операция: новая матрица строится так, что строки исходной становятся столбцами новой. Формально: B = A^T, где B[i][j] = A[j][i].

Короткое определение: транспонирование — перестановка индексов строк и столбцов.

Important: индексирование в коде обычно начинается с 0. Всегда проверяйте размеры перед обращением к элементам.

Примеры и задача

В задаче дана матрица mat[][]. Нужно найти и вывести её транспонированную матрицу.

Иллюстрация транспонирования матрицы

Интуитивное правило

  • Для прямоугольной матрицы размером rows × cols транспонированная будет иметь размер cols × rows.
  • Для каждой пары индексов: transpose[i][j] = mat[j][i].

Транспонирование прямоугольной матрицы: объяснение и примеры

Алгоритм простой и детерминированный:

  1. Создайте пустую матрицу размера cols × rows.
  2. Для i от 0 до cols-1 и j от 0 до rows-1 присвойте transpose[i][j] = mat[j][i].
  3. Выведите результат.

Сложность: 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 5

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
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 5

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; 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 5

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 < 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)]

Мини-методология: пошаговый план для реализации

  1. Проверить размеры матрицы: rows и cols.
  2. Если rows == 0 или cols == 0 — вернуть пустую матрицу.
  3. Если rows == cols — решить, делать in-place или выделить новую память.
  4. Реализовать и протестировать на малых примерах.
  5. Добавить тесты на пограничные случаи, профилировать при больших данных.

Чек-лист для приёмки кода

  • Работает на квадратных и прямоугольных матрицах.
  • Обрабатывает пустые матрицы и единичные строки/столбцы.
  • Нет выхода за пределы массива (проверены индексы).
  • Для 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

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро