Транспонирование матриц в C++ с использованием векторов: подробное руководство

В этой статье блога мы рассмотрим различные методы транспонирования матриц с использованием векторов на языке программирования C++. Транспонирование матрицы предполагает замену ее строк столбцами, в результате чего получается новая матрица с обратными размерами. Мы обсудим различные подходы и приведем примеры кода, которые помогут вам лучше понять концепции.

Метод 1: использование вложенных векторов
Самый простой метод транспонирования матрицы — использование вложенных векторов. Вот пример фрагмента кода:

#include <iostream>
#include <vector>
std::vector<std::vector<int>> transposeMatrix(const std::vector<std::vector<int>>& matrix) {
    int rows = matrix.size();
    int cols = matrix[0].size();
    std::vector<std::vector<int>> transposed(cols, std::vector<int>(rows));
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            transposed[j][i] = matrix[i][j];
        }
    }
    return transposed;
}
int main() {
    std::vector<std::vector<int>> matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    std::vector<std::vector<int>> transposedMatrix = transposeMatrix(matrix);
    // Output the transposed matrix
    for (const auto& row : transposedMatrix) {
        for (const auto& element : row) {
            std::cout << element << " ";
        }
        std::cout << "\n";
    }
    return 0;
}

Метод 2: использование одного вектора
Если вы предпочитаете плоское представление матрицы, вы можете использовать один вектор для хранения транспонированной матрицы. Вот пример:

#include <iostream>
#include <vector>
std::vector<int> transposeMatrix(const std::vector<int>& matrix, int rows, int cols) {
    std::vector<int> transposed(cols * rows);
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            transposed[j * rows + i] = matrix[i * cols + j];
        }
    }
    return transposed;
}
int main() {
    std::vector<int> matrix = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int rows = 3;
    int cols = 3;
    std::vector<int> transposedMatrix = transposeMatrix(matrix, rows, cols);
    // Output the transposed matrix
    for (int i = 0; i < cols; ++i) {
        for (int j = 0; j < rows; ++j) {
            std::cout << transposedMatrix[i * rows + j] << " ";
        }
        std::cout << "\n";
    }
    return 0;
}

Метод 3: использование указателей
Другой эффективный подход предполагает использование указателей для транспонирования матрицы на месте. Этот метод позволяет избежать необходимости в дополнительной памяти. Вот пример:

#include <iostream>
#include <vector>
void transposeMatrix(std::vector<std::vector<int>>& matrix) {
    int rows = matrix.size();
    int cols = matrix[0].size();
    for (int i = 0; i < rows; ++i) {
        for (int j = i + 1; j < cols; ++j) {
            std::swap(matrix[i][j], matrix[j][i]);
        }
    }
}
int main() {
    std::vector<std::vector<int>> matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    transposeMatrix(matrix);
    // Output the transposed matrix
    for (const auto& row : matrix) {
        for (const auto& element : row) {
            std::cout << element << " ";
        }
        std::cout << "\n";
    }
    return 0;
}

В этой статье рассмотрено несколько методов транспонирования матриц с использованием векторов в C++. Вы узнали, как использовать вложенные векторы, один вектор и указатели для достижения желаемого результата. Каждый метод имеет свои преимущества и может быть выбран исходя из ваших конкретных требований. Поэкспериментируйте с этими методами, чтобы расширить свои возможности манипулирования матрицами в C++.