Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/47: Рейтинг темы: голосов - 47, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 17
1

Транспонировать вектор векторов

26.10.2016, 23:44. Показов 8711. Ответов 5

Author24 — интернет-сервис помощи студентам
Есть кусочек кода, который генерирует вектор векторов matrix, как можно транспонировать matrix?
Планируется потом отсортировать строки (вектора) по убыванию максимальных элементов этих строк (векторов) транспонированной матрицы, а потом её ещё раз транспонировать и вывести на экран.

Цель этих процедур: сделать вектор векторов (matrix) в которого столбики отсортированы по убыванию максимальных элементов этих столбиков.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int genereting_matrix(vector<vector<int>> &matrix)
{
    int row, col;
    cout << "Введите количество строк:";
    cin >> row;
    cout << "Введите количество колонок:";
    cin >> col;
 
    for (int i = 0; i < row; i++)
    {
        vector<int> temp;
        for (int j = 0; j < col; j++)
        {
            temp.push_back(random_element());//Случайные числа
            cout <<left<<setw(5)<< temp[j];
        }
        cout << endl;
        matrix.push_back(temp);
    }
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2016, 23:44
Ответы с готовыми решениями:

Добавление элементов в многомерный вектор (вектор векторов)
Я могу создавать двухмерный вектор таким способом: vector&lt;vector&lt;int&gt;&gt; a; Он представляет из себя...

Разбить вектор на вектор векторов по разделителю
По простому сделал for (size_t i = 0; i &lt; new_arr.size(); i++) { ...

Вектор векторов
Хочу создать вектор, содержащий векторы, которые содержат строки. Написал такой код: #include...

Вектор векторов
Нужно научиться создавать вектор в векторе, нашёл такой сайт но остались некоторые вопросы,...

5
9 / 9 / 5
Регистрация: 06.01.2016
Сообщений: 55
26.10.2016, 23:53 2
Лучший ответ Сообщение было отмечено Amimitl как решение

Решение

Создать новый вектор векторов и, проходя по изначальному с индексацией j , i (при вложенном цикле j) выполнять push_back для новой матрицы.

Примерно так:

C++
1
2
3
4
5
6
7
8
    vector<vector<int>> newMatrix(matrix.size());
    for (int i = 0; i < matrix.size(); i++)
    {
        for (int j = 0; j < matrix.size(); j++)
        {
            newMatrix[i].push_back(matrix[j][i]);
        }
    }
1
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
27.10.2016, 00:12 3
Цитата Сообщение от KOHTPOJIEP Посмотреть сообщение
Примерно так:
Решение неправильное. Этот вариант кода завязан на то, что матрица квадратная. А вся суть задачи как раз в том, что матрица может быть не квадратной.
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 17
27.10.2016, 00:26  [ТС] 4
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Решение неправильное. Этот вариант кода завязан на то, что матрица квадратная. А вся суть задачи как раз в том, что матрица может быть не квадратной.
Мне подходит и квадратная, но если подскажете как сделать ещё и не с квадратной будет очень супер.
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
27.10.2016, 00:30 5
Цитата Сообщение от Amimitl Посмотреть сообщение
Мне подходит и квадратная
Если вам "подходит и квадратная", то почему в вашем исходном коде отдельно вводятся обе размерности?

Для квадратной матрицы операция транспонирования "на месте" тривиальна

C++
1
2
3
for (size_t i = 0; i < matrix.size(); ++i)
  for (size_t j = i + 1; j < matrix.size(); ++j)
    std::swap(matrix[i][j], matrix[j][i]);
1
9 / 9 / 5
Регистрация: 06.01.2016
Сообщений: 55
27.10.2016, 00:37 6
Лучший ответ Сообщение было отмечено Amimitl как решение

Решение

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

C++
1
2
3
4
5
6
7
8
    vector<vector<int>> newMatrix(matrix[0].size());
    for (int i = 0; i < matrix[0].size(); i++)
    {
        for (int j = 0; j < matrix.size(); j++)
        {
            newMatrix[i].push_back(matrix[j][i]);
        }
    }
Такой код задаст число строк новой матрицы, равное длине первой строки исходной матрицы, т.е. числу её столбцов. И длину цикла изменяем соответственно. Внутри цикла вместо matrix[0].size() можно написать newMatrix.size().
1
27.10.2016, 00:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2016, 00:37
Помогаю со студенческими работами здесь

Вектор векторов
Вектор векторов - плюсы и минусы, альтернативы. Подскажите новичку) P.S. Внутри массив из 2х...

Вектор векторов string
Нужно реализовать класс Table, который содержит вектор векторов string и методы для работы с этой...

Вектор векторов строк
День добрый! Вопрос такой: есть txt файл, его я считываю построчно, заношу каждую строку в вектор...

Вектор векторов инициализация
Вопрос по поводу работы с двумерными векторами(&quot;матрицами&quot;). Например, необходимо создать матрицу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru