Транспонировать матрицу: замена элементов не изменяет значения - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь транспонировать матрицу, построенную из векторов.

Вот функция транспонирования, которую я написал:

void transpose(std::vector<std::vector<int>>& fill_mat) {
    for (int i = 0; i < fill_mat.size(); ++i) {
        for (int j = 0; j < fill_mat.size(); ++j) {
            std::swap(fill_mat[i][j], fill_mat[j][i]);
        }
    }
}

Кажется, она ничего не делает: мои окончательные результатытакие же, как и начальные.


Вот моя полная программа:

#include<iostream>
#include<vector>
#include<utility>

void print_matrix(std::vector<std::vector<int>>& to_print) {
    for (int i = 0; i < to_print.size(); ++i) {
        for (int j = 0; j < to_print.size(); ++j) {
            std::cout << " " << to_print[i][j];
        }
        std::cout << std::endl;
    }
}

void make_matrix(std::vector<std::vector<int>>& fill_mat) {
    for (int i = 0; i < fill_mat.size(); ++i) {
        for (int j = 0; j < fill_mat.size(); ++j) {
            fill_mat[i][j] = rand() % 15;
        }
    }
}

void transpose(std::vector<std::vector<int>>& fill_mat) {
    for (int i = 0; i < fill_mat.size(); ++i) {
        for (int j = 0; j < fill_mat.size(); ++j) {
            std::swap(fill_mat[i][j], fill_mat[j][i]);
        }
    }
}


int main() {
    int size = 3;
    std::vector<std::vector<int>> matrix_sample(size, std::vector<int>(size));

    make_matrix(matrix_sample);
    print_matrix(matrix_sample);

    transpose(matrix_sample);

    std::cout << "----## transpose ##-----" << std::endl;
    print_matrix(matrix_sample);
}

Я ожидал распечатать транспонированную матрицу, но вход в итоге был таким же, каквыход.Что я делаю не так?

1 Ответ

0 голосов
/ 04 октября 2018

Вы меняете (i, j) с (j, i) дважды!Вот почему это не имеет никакого эффекта.

Вы должны работать только на одной половине своей матрицы.Плюс незначительные улучшения, мы получаем:

void transpose(std::vector<std::vector<int>>& fill_mat)
{
    using size_type = decltype(fill_mat)::size_type; // better use your matrix' size type
    for (size_type i = 0; i < fill_mat.size(); ++i) {
        for (size_type j = 0; j < i; ++j) {
            using std::swap; // see swap idiom
            swap(fill_mat[i][j], fill_mat[j][i]);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...