Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
1

Хитрое транспонирование матрицы

12.08.2016, 20:09. Показов 3003. Ответов 33
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Значится так, есть матрица загнанная в вектор... есть ли способ транспонировать ее не создавая новый вектор, то есть просто обменивая элементы в исходном?

P.S: Матрица не обязательно квадратная!!!

Добавлено через 25 минут
а задачка то не тривиальная))))

наведу простой пример, чтоб было понятней:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
      исходная матрица
      1 2
      3 4
      5 6
 
      нужно (выходная матрица)
      1  3  5
      2  4  6
 
      представление в векторе (исходная матрица):
      1 2 3 4 5 6
 
      представление в векторе (матрица-результат):
      1 3 5 2 4 6
*/
разумеется нужен общий алгоритм, а не под какой-то конкретный случай)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.08.2016, 20:09
Ответы с готовыми решениями:

Транспонирование матрицы
#include <stdio.h> #include <stdlib.h> void transponirovanie(int**mass1, int stolb, int str)...

Транспонирование матрицы
Всем привет есть код транспонирования матрицы. Алгоритм вроде бы рабочий но, почему то не работает...

Транспонирование матрицы
В среде MS Visual C++ разработать программу, которая формирует матрицу размером n х m (значения n,...

Транспонирование матрицы
Что нужно изменить, дабы вместо подсчета произведения элементов матрицы, матрица просто...

33
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
13.08.2016, 13:16 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от JIawliet Посмотреть сообщение
его код сверху, что вам мешает посмотреть?
неудобно читать такой код (не в обиду мр.иксу )
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
13.08.2016, 13:20  [ТС] 22
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
неудобно читать такой код
на самом деле это так кажется)) поначалу да, а как привыкнешь - очень даже удобно... определенно у такого стиля есть некий порог вхождения)
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
13.08.2016, 13:28 23
JIawliet, мне интересно, по какому алгоритму ты будиш писать свой код, я просто не оч понил про твой способ без хранения индексов
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
13.08.2016, 16:36  [ТС] 24
Ferrari F1, а я сам еще не знаю)))) как доделаю напишу)

Добавлено через 3 часа 0 минут
Ferrari F1,
И так, вот что получилось (+ еще один интересный вариант, такого не предлогали):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
    template <typename T>
    Matrix<T>& Matrix<T>::conjugateMatr ()
    {
        /*checkMatr();
 
        auto newPvt = std::unique_ptr<std::vector<T>>(new std::vector<T>());
 
        for (size_t k = 0; k != columns; ++k)
            for (size_t j = 0; j != rows; ++j)
                newPvt -> push_back((*this)(j, k));
 
        upvt.reset(newPvt.release());
 
        std::swap(rows, columns);
 
        return *this;*/
 
 
        checkMatr();
 
        if (rows != 1 && columns != 1)
        {
            std::map<T, size_t> indexes;
            for (size_t j = 1; j != upvt -> size() - 1; ++j)
                indexes[(*upvt)[j]] = rows * (j % columns) + j / columns;
 
 
            for (auto it = indexes.begin(), itend = indexes.end();
                 it != itend; ++it)
                if ((*upvt)[it -> second] != it -> first)
                    std::swap(*(std::find(upvt -> begin(),
                                          upvt -> end(),
                                          it -> first)),
                        (*upvt)[it -> second]);
        }
 
        std::swap(rows, columns);
 
        return *this;
    }
Закомментированный вариант: создается дополнительный вектор и из первого копируем элементы во второй в правильном порядке. Просто.

Другой вариант: создается map и каждому элементу из исходной матрицы присваивается индекс (где он будет стоять в транспонированной матрице), первый и последний элементы стоят на месте, поэтому их игнорируем. Далее просто запускаем цикл по всему map и переставляем элементы из вектора в нужные позиции.

Без сохранения индексов (создания map) не осилил(

Замечено, что для транспонирования матрицы-вектора с количеством элементов n, нужно всего n / 2 обменов элементов... оставим поиски этого мега-алгоритма людям, у которых больше свободного времени и есть невиданное желание транспонировать матрицы
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
13.08.2016, 17:50 25
Лучший ответ Сообщение было отмечено JIawliet как решение

Решение

Цитата Сообщение от JIawliet Посмотреть сообщение
оставим поиски этого мега-алгоритма людям, у которых больше свободного времени и есть невиданное желание транспонировать матрицы
Главное, это не опускать руки!
Вот, сделал практически без использования памяти. Память выделяется только в vector<bool> по одному биту на элемент матрицы только для того, чтобы отмечать индексы уже обработанных элементов. Если быть принципиальным, то можно и без этого вектора обойтись, и хранить только первые индексы обработанных циклов. Но тогда работать будет дольше: каждый индекс вектора надо будет прогонять по циклу, пока он опять не перейдет в себя, и следить, не содержатся ли в цикле начальные элементы уже обработанных циклов.
Мой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
///////////////////////////////////////////////////////////////////////////////
//4.
///////////////////////////////////////////////////////////////////////////////
//есть матрица загнанная в вектор... есть ли способ транспонировать
//ее не создавая новый вектор, то есть просто обменивая элементы в исходном?
//P.S: Матрица не обязательно квадратная!!!
///////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <vector>
///////////////////////////////////////////////////////////////////////////////
typedef int                             T_val;
typedef std::vector     < T_val     >   T_values;
typedef std::vector     < bool      >   T_ind_is_processed;
///////////////////////////////////////////////////////////////////////////////
typedef T_values                        T_row;
typedef std::vector     < T_row     >   T_matr;
///////////////////////////////////////////////////////////////////////////////
struct  T_lin_matr
{
    //-------------------------------------------------------------------------
    int         cols_total_;
    T_values    values_;
    //-------------------------------------------------------------------------
    template    < typename  TT_matr >
    T_lin_matr
        (
            int                     rows_total,
            int                     cols_total,
            TT_matr     const   &   matr
        )
        :
        cols_total_     ( cols_total ),
 
        values_         (
                                rows_total
                            *   cols_total
                        )
    {
        for( int  i{}; i < rows_total; ++i )
        {
            for( int  j{}; j < cols_total; ++j )
            {
                operator()( i, j )   =   matr[i][j];
            }//for
        }//for
    }
    //-------------------------------------------------------------------------
    int     rows_total()
    {
        return      values_.size()
                /   cols_total_;
    }
    //-------------------------------------------------------------------------
    T_val   &   operator()
        (
            int     i,
            int     j
        )
    {
        return  values_[ i * cols_total_ + j ];
    }
    //-------------------------------------------------------------------------
    void    transp()
    {
        T_ind_is_processed  ind_is_processed    (
                                                    values_.size()
                                                );
 
        int         unprocessed_ind_min     {};
 
        for(;;)
        {
            unprocessed_ind_min
 
                =       std::find_if
                            (
                                    ind_is_processed.begin      ()
                                +   unprocessed_ind_min,
 
                                ind_is_processed.end            (),
 
                                []                              ( auto  val )
                                {
                                    return  val     ==  0;
                                }
                            )
 
                    -   ind_is_processed.begin();
 
            if  (
                        unprocessed_ind_min
 
                    ==  int (
                                values_.size()
                            )
                )
            {
                cols_total_     =   rows_total();
                break;
            }
 
            execute_loop
                (
                    unprocessed_ind_min,
                    ind_is_processed
                );
        }//for
    }
    //-------------------------------------------------------------------------
    void    execute_loop
        (
            int                     first_loop_ind,
            T_ind_is_processed  &   ind_is_processed
 
        )//I
    {
        auto    last_loop_ind   =   ind_of_transp_ind( first_loop_ind );
        int     cur_loop_ind    =   last_loop_ind;
        ind_is_processed[ first_loop_ind ]  =   1;
 
        do
        {
            std::swap   (
                            values_[ cur_loop_ind   ],
                            values_[ first_loop_ind ]
                        );
 
            ind_is_processed[ cur_loop_ind ]    =   1;
 
            cur_loop_ind    =   ind_of_transp_ind( cur_loop_ind );
        }
        while   (
                        cur_loop_ind
                    !=  first_loop_ind
                );
    }
    //-------------------------------------------------------------------------
    int     ind_of_transp_ind( int  t )
    {
        return  t / cols_total_ + t % cols_total_ * rows_total();
    }
    //-------------------------------------------------------------------------
    int     transp_ind_of_ind( int     k )
    {
        return  k / rows_total() + k %  rows_total() * cols_total_;
    }
    //-------------------------------------------------------------------------
    void    print()
    {
        for( size_t  k{}; k < values_.size(); ++k )
        {
            std::cout   <<  values_[k]
                        <<  '\t';
 
            if  (
                    (k + 1)     %   cols_total_     ==  0
                )
            {
                std::cout   <<  std::endl;
            }
        }//for
 
        std::cout   <<  std::endl;
    }
    //-------------------------------------------------------------------------
};
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    srand(unsigned(time(0)));
 
    for(;;)
    {
        const   int     rows_total{ rand() % 5 + 2 };
        const   int     cols_total{ rand() % 5 + 2 };
 
        T_matr  matr    (
                            rows_total,
                            T_row( cols_total )
                        );
 
        for( int  i{}; i < rows_total; ++i )
        {
            for( int  j{}; j < cols_total; ++j )
            {
                matr[i][j]  =   rand()  %   10  +   1;
            }
        }//for
 
        T_lin_matr  lin_matr    (
                                    rows_total,
                                    cols_total,
                                    matr
                                );
 
        lin_matr.print      ();
        lin_matr.transp     ();
        lin_matr.print      ();
 
        system("pause");
    }//for
}
1
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
13.08.2016, 19:22 26
Цитата Сообщение от JIawliet Посмотреть сообщение
Без сохранения индексов (создания map) не осилил(
а знаешь, почему так?

Допустим есть такой вектор-матрица 4х2

1, 2, 3, 4, 5, 6, 7, 8

из него должен получиться вектор-матрица 2х4

1, 3, 5, 7, 2, 4, 6, 8

таким образом, элемент со значением 2 переместиться с 1ого индекса на 4
если мы обменяем эти два значения, получится

1, 5, 3, 4, 2, 6, 7, 8

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

Стоит еще заметить, что это и есть цена за обмен значений внутри матрицы, не выходя за ее пределы (т.е. без копирования ее элементов)
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
13.08.2016, 19:28  [ТС] 27
Mr.X, ага - оно самое!) минимум обменов, лишней памяти не выделяется, сказка)))

Хочу вас кое о чем попросить, потому что за вами я поправлять код не решился :
a) убрать из кода функцию:
C++
1
2
3
4
 int     transp_ind_of_ind( int     k )
    {
        return  k / rows_total() + k %  rows_total() * cols_total_;
    }
она не нужна и если честно ее предназначения осталось для меня загадкой)

b) в функцию execute_loop перед циклом do - while добавить следующую проверку:
C++
1
2
if (cur_loop_ind == first_loop_ind)
       return;
ну смысл понятен, незачем менять местами элементы, которые уже находятся там, где надо) (это относится в основном к первому и последнему элементу; как вариант можно в векторе ind_is_processed первый и последний элемент в true сразу ставить)

Большое спасибо за то, что не пожалели время и довели решение задачи до ума, нет - до идеального состояния) Само собой я отмечу лучший ответ)

Добавлено через 4 минуты
Ferrari F1, да это ясно)) вон Mr.X, предложил пожалуй идеальный вариант решения... распечатайте код, не поленитесь разобраться, это реально круто)

память выделялась только под std::vector<bool> в котором просто отмечалось обработан ли конкретный элемент или нет...
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
13.08.2016, 19:43 28
JIawliet, у меня еще есть такой вариант упрощения алгоритма:
о всякой матрице с обоими размерами хотя бы больше одного можно говорить, что она содержит в себе квадратную матрицу
В таком случае эту кв. матрицу поменяем кодом, что кинул zss, а остатки, что выходят из квадратной области, шлифануть каким-нить другим алгоритмом.

Хотя, могу и ошибиться что это будет верным для решения
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
13.08.2016, 19:51  [ТС] 29
Ferrari F1, а я так уже пробовал, но до ума не довел... тут дело в том, что те элементы, которые не входят в квадратную матрицу, потом переставляют элементы, которые входили в квадратную матрицу, с их законных мест)
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
13.08.2016, 19:53 30
JIawliet, вобщемя я уже задалбался чесна гря) моих сил хватило на этот код с картой
Пашел ка я рубиться в ксску_)
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
13.08.2016, 20:02  [ТС] 31
Ferrari F1, ну задача решена - решена, причем было предложено множество вариантов решения)
0
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
13.08.2016, 20:05 32
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Babysitter, а у вас что получилось?
я начал утром что-то писать, сейчас продолжу.. может чего и выйдет.
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
13.08.2016, 20:32 33
Цитата Сообщение от JIawliet Посмотреть сообщение
убрать из кода функцию
Я тоже вспомнил, что забыл ее выбросить.
Цитата Сообщение от JIawliet Посмотреть сообщение
в функцию execute_loop перед циклом do - while добавить следующую проверку
Да, на самом деле здесь проверку надо в начале цикла сделать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
///////////////////////////////////////////////////////////////////////////////
//5.
///////////////////////////////////////////////////////////////////////////////
//есть матрица загнанная в вектор... есть ли способ транспонировать
//ее не создавая новый вектор, то есть просто обменивая элементы в исходном?
//P.S: Матрица не обязательно квадратная!!!
///////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <vector>
///////////////////////////////////////////////////////////////////////////////
typedef int                             T_val;
typedef std::vector     < T_val     >   T_values;
typedef std::vector     < bool      >   T_ind_is_processed;
///////////////////////////////////////////////////////////////////////////////
typedef T_values                        T_row;
typedef std::vector     < T_row     >   T_matr;
///////////////////////////////////////////////////////////////////////////////
struct  T_lin_matr
{
    //-------------------------------------------------------------------------
    int         cols_total_;
    T_values    values_;
    //-------------------------------------------------------------------------
    template    < typename  TT_matr >
    T_lin_matr
        (
            int                     rows_total,
            int                     cols_total,
            TT_matr     const   &   matr
        )
        :
        cols_total_     ( cols_total ),
 
        values_         (
                                rows_total
                            *   cols_total
                        )
    {
        for( int  i{}; i < rows_total; ++i )
        {
            for( int  j{}; j < cols_total; ++j )
            {
                operator()( i, j )   =   matr[i][j];
            }//for
        }//for
    }
    //-------------------------------------------------------------------------
    int     rows_total()
    {
        return      values_.size()
                /   cols_total_;
    }
    //-------------------------------------------------------------------------
    T_val   &   operator()
        (
            int     i,
            int     j
        )
    {
        return  values_[ i * cols_total_ + j ];
    }
    //-------------------------------------------------------------------------
    void    transp()
    {
        T_ind_is_processed  ind_is_processed        (
                                                        values_.size()
                                                    );
 
        int                 unprocessed_ind_min     {};
 
        for(;;)
        {
            unprocessed_ind_min
 
                =       std::find_if
                            (
                                    ind_is_processed.begin      ()
                                +   unprocessed_ind_min,
 
                                ind_is_processed.end            (),
 
                                []                              ( auto  val )
                                {
                                    return  val     ==  0;
                                }
                            )
 
                    -   ind_is_processed.begin();
 
            if  (
                        unprocessed_ind_min
 
                    ==  int (
                                values_.size()
                            )
                )
            {
                cols_total_     =   rows_total();
                break;
            }
 
            execute_loop
                (
                    unprocessed_ind_min,
                    ind_is_processed
                );
        }//for
    }
    //-------------------------------------------------------------------------
    void    execute_loop
        (
            int                     first_loop_ind,
            T_ind_is_processed  &   ind_is_processed
        )
    {
        auto    cur_loop_ind    =   ind_of_transp_ind( first_loop_ind );
        ind_is_processed[ first_loop_ind ]  =   1;
 
        while   (
                        cur_loop_ind
                    !=  first_loop_ind
                )
        {
            std::swap   (
                            values_[ cur_loop_ind   ],
                            values_[ first_loop_ind ]
                        );
 
            ind_is_processed[ cur_loop_ind ]    =   1;
 
            cur_loop_ind    =   ind_of_transp_ind( cur_loop_ind );
        }//while
    }
    //-------------------------------------------------------------------------
    int     ind_of_transp_ind( int  t )
    {
        return  t / cols_total_ + t % cols_total_ * rows_total();
    }
    //-------------------------------------------------------------------------
    void    print()
    {
        for( size_t  k{}; k < values_.size(); ++k )
        {
            std::cout   <<  values_[k]
                        <<  '\t';
 
            if  (
                    (k + 1)     %   cols_total_     ==  0
                )
            {
                std::cout   <<  std::endl;
            }
        }//for
 
        std::cout   <<  std::endl;
    }
    //-------------------------------------------------------------------------
};
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    srand(unsigned(time(0)));
 
    for(;;)
    {
        const   int     rows_total{ rand() % 5 + 2 };
        const   int     cols_total{ rand() % 5 + 2 };
 
        T_matr  matr    (
                            rows_total,
                            T_row( cols_total )
                        );
 
        for( int  i{}; i < rows_total; ++i )
        {
            for( int  j{}; j < cols_total; ++j )
            {
                matr[i][j]  =   rand()  %   10  +   1;
            }
        }//for
 
        T_lin_matr  lin_matr    (
                                    rows_total,
                                    cols_total,
                                    matr
                                );
 
        lin_matr.print      ();
        lin_matr.transp     ();
        lin_matr.print      ();
 
        system("pause");
    }//for
}
Добавлено через 10 минут
Цитата Сообщение от JIawliet Посмотреть сообщение
Ferrari F1, а я так уже пробовал, но до ума не довел... тут дело в том, что те элементы, которые не входят в квадратную матрицу, потом переставляют элементы, которые входили в квадратную матрицу, с их законных мест)
Да, это только при транспонировании квадратной матрицы циклы перестановки имеют длину 1 и 2. У прямоугольной они подлиннее.
1
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
14.08.2016, 09:44 34
окей, вчера ночью это заработало. какая наивная идея у меня была
пусть есть у нас N=2 M=3
1 2 3 4 5 6
я начинаю с первого элемента и перемещаю его на новое место, на место тройки в данном случае.
но куда девать тройку? повторяем процедуру и так до тех пор пока все не замкнется (так я думал)
[1] -> [2]
[2] -> [4]
[4] -> [3]
[3] -> [1]

воот. но естественно на другом примере такое 'замыкание' совсем не означает, что все элементы
пройдены и матрица транспонирована. пришлось ввести битовый вектор, который при таком дедлоке
продолжал бы работу до победного конца.

пытался писать аккуратно, но на многое забил, чтобы кода было поменьше.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <algorithm>
#include <iostream>
#include <vector>
 
template <typename Type>
using Iterator = typename Type::iterator;
 
template <typename T>
class Matrix
{
    using Vect = typename std::vector<T>;
    using Iter = Iterator<std::vector<T>>;
    Vect data_;
    size_t N_;
    size_t M_;
    size_t coords_to_index(size_t i, size_t j, size_t M) const { return i*M + j; }
    void index_to_coords(size_t d, size_t M, size_t& i, size_t& j) const { i = d / M; j = d - (d / M)*M; }
public:
    Matrix(size_t N, size_t M) : N_(N), M_(M), data_(N*M) {}
    size_t N() { return N_; };
    size_t M() { return M_; };
    Iter operator[](size_t i) { return data_.begin() + i*M_; } 
    void transpose()
    {
        size_t oldN{ N_ }, oldM{ M_ };
        std::swap(N_, M_);
 
        std::vector<bool> done(data_.size(), false);
        done[0] = true;
 
        for (auto it = done.begin() + 1; (it = std::find(done.begin(), done.end(), false)) != done.end();)
        {
            size_t what_to_mov = it - done.begin();
            size_t i{ 0 }, j { 0 };
            index_to_coords(what_to_mov, oldM, i, j);
            T temp = data_[what_to_mov];
            do {
                size_t where_to_mov = coords_to_index(j, i, M_);
                std::swap(temp, data_[where_to_mov]);
                index_to_coords(where_to_mov, oldM, i, j);
                done[what_to_mov] = true;
                what_to_mov = where_to_mov;
            } while(!done[what_to_mov]);
        }
    }
};
 
template <typename T>
static inline void print(Matrix<T>& a)
{
    for(size_t i = 0; i < a.N(); ++i)
    {
        for(size_t j = 0; j < a.M(); ++j)
            std::cout << a[i][j] << '\t';
        std::cout << std::endl;
    }
}
 
int main()
{
    const size_t N{ 5 }, M{ 2 };
    Matrix<int> a(N, M);
    for(size_t i = 0; i < N; ++i)
        for(size_t j = 0; j < M; ++j)
            a[i][j] = i*M + j + 1;
    print(a);
    std::cout << std::endl;
    a.transpose();
    print(a);
}
1
14.08.2016, 09:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.08.2016, 09:44
Помогаю со студенческими работами здесь

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

Транспонирование матрицы
Объясните где ошибка и как ее исправить Задание написать функцию переворачивающие двумерный...

Транспонирование матрицы
*/20.Транспонирование матрицы .

Транспонирование матрицы
Помогите пожалуйста разобраться. Транспонирована ли матрица в заданном коде? Точнее, что является...


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

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