Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Amimitl
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 17
1

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

26.10.2016, 23:44. Просмотров 808. Ответов 5

Есть кусочек кода, который генерирует вектор векторов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2016, 23:44
Ответы с готовыми решениями:

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

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

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

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

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

5
KOHTPOJIEP
9 / 9 / 5
Регистрация: 06.01.2016
Сообщений: 52
Завершенные тесты: 1
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
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4838 / 2483 / 695
Регистрация: 18.10.2014
Сообщений: 4,290
27.10.2016, 00:12 3
Цитата Сообщение от KOHTPOJIEP Посмотреть сообщение
Примерно так:
Решение неправильное. Этот вариант кода завязан на то, что матрица квадратная. А вся суть задачи как раз в том, что матрица может быть не квадратной.
0
Amimitl
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 17
27.10.2016, 00:26  [ТС] 4
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Решение неправильное. Этот вариант кода завязан на то, что матрица квадратная. А вся суть задачи как раз в том, что матрица может быть не квадратной.
Мне подходит и квадратная, но если подскажете как сделать ещё и не с квадратной будет очень супер.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4838 / 2483 / 695
Регистрация: 18.10.2014
Сообщений: 4,290
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
KOHTPOJIEP
9 / 9 / 5
Регистрация: 06.01.2016
Сообщений: 52
Завершенные тесты: 1
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2016, 00:37

вектор векторов - умножение
У меня есть: vector&lt;std::vector&lt;double&gt;&gt; a std::vector&lt;double&gt; b мне нужно...

Вектор векторов - не компилируется код
Дорого времени суток. Я написала небольшую функцию, в которой объявляется...

Загрузка txt в вектор векторов
Здравствуйте. На входе есть txt с несколькими строками. Также есть...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru