2014-12-05 2 views
1

У меня есть матрица 6 x 6, и я сохраняю ее значения в одномерном массиве размером 36. Я хочу изменить его так, чтобы строки были столбцами, а столбцы - строк. Мой метод пытается скопировать значения в другой массив, но отсортирован правильно. Я пытаюсь для цикла:Столбцы и строки коммутационной матрицы в C++

for (int i = 0; i < 6; ++i){ 
     copyArray[i]= array[i*6]; 
    } 

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

Я кодирую на C++, но если кто-то может сделать это на том же языке, что было бы хорошо. Я чувствую, что это математическая проблема.

Вопрос: Как я могу решить для переключения строк и столбцов? (Пример: если я обозначаю первые строки и столбцы как 0, в матрице 6x6, то обе строки и столбцы идут от 0 до 5. Поэтому, переключая строки и столбцы, значение в строке 2, столбец 5 будет переключается со значением в строке 5, столбец 2.)

+0

Не можете ли вы сохранить матрицу как 2D-массив? –

+1

@MuhammetAliAsan: Как это поможет? – Deduplicator

+0

называется так называемой матричной транспозицией *. – didierc

ответ

2

Не могли бы вы просто использовать вложенный цикл for и сделать что-то вроде этого?

for (int i = 0; i < 6; ++i) 
    for (int j = 0; j < 6; ++j) 
     copyArray[i*6+j]= array[j*6+i]; 

Вот тестовая программа вы можете запустить, чтобы показать, что это работает:

#include <stdio.h> 

int main() 
{ 
    int array[36] = {1,1,1,1,1,1, 
        2,2,2,2,2,2, 
        3,3,3,3,3,3, 
        4,4,4,4,4,4, 
        5,5,5,5,5,5, 
        6,6,6,6,6,6}; 
    int copyarray[36]; 

    for (int i = 0; i < 6; ++i) 
     for (int j = 0; j < 6; ++j) 
      copyarray[i*6+j]= array[j*6+i]; 

    for (int i = 0; i < 36; ++i) 
    { 
     if (i % 6 == 0) 
      printf("\n"); 

     printf("%d ", array[i]); 

    } 

    printf("\n"); 
    printf("\n"); 

    for (int i = 0; i < 36; ++i) 
    { 
     if (i % 6 == 0) 
      printf("\n"); 

     printf("%d ", copyarray[i]); 
    } 

    return 0; 
} 

Выход:

1 1 1 1 1 1 
2 2 2 2 2 2 
3 3 3 3 3 3 
4 4 4 4 4 4 
5 5 5 5 5 5 
6 6 6 6 6 6 


1 2 3 4 5 6 
1 2 3 4 5 6 
1 2 3 4 5 6 
1 2 3 4 5 6 
1 2 3 4 5 6 
1 2 3 4 5 6 
+0

Спасибо, я попробую. Это именно то, что я пытался сделать, но не мог понять правильные комбинации переменных/математических операторов. Сложная алгебра чувствует себя как древнее знание. – JCoder

+0

Все, что я сделал, чтобы разобраться в двух формулах в '[]', состояло в том, чтобы указать, какие значения я им хотел, а затем поместить шаблон в терминах 6, а затем, наконец, в терминах 'i' и' j'. Например, мы хотим, чтобы тот, который слева, следовал шаблону '0 1 2 3 4 5 6 7 8 9 10 11 12 ... 35', и мы хотим, чтобы тот, который справа, следовал шаблону' 0 6 12 18 24 30 1 7 13 19 25 31 ... 35'. Затем мы ставим его в терминах '6': первый шаблон становится' (0 * 6 + 0) (0 * 6 + 1) ... (5 * 6 + 5) ', а второй шаблон становится' (0 * 6 + 0) (1 * 6 + 0) (2 * 6 + 0) ... (5 * 6 + 5) '. Наконец, мы можем выразить это в терминах 'i' и' j', как видно. – RPGillespie

0
for(int i=0;i<6;i++) 
    for(int j=0;j<6;j++) 
     {   }//You can do whatever you want on original matrix here 

Давайте предположим, что вы хотите "транспонирование матрицы" и сделать некоторая обработка. Базовый переключатель i и j

for(int j=0;j<6;j++) // replaceed i with j 
    for(int i=0;i<6;i++) 
     {    }//You can do whatever you want on transpose matrix here 
+0

Да, я пытался это сделать, но не смог определить переменную/операторную последовательность для коммутатора. Это была алгебра, которая подслушивала меня, но спасибо! – JCoder

+1

@JCoder: BTW: После того, как вы приняли один из ответов (в зависимости от того, что вам больше всего помогло), у вас будет 16 реп (еще 2) и, таким образом, достаточно, чтобы повысить эффективность ответов, которые вам помогли (также по старым вопросам, если вы хотите повторно посетить их). Хотя вы не просто повышаете ответ, потому что кто-то пытался помочь, а потому, что сам ответ полезен. – Deduplicator

+0

@ JCoder вы должны принять один из ответов и upvote –

0

Вы должны хранить свой одномерный массив внутри класса.
Затем вы можете поменять размерность данных без фактического перемещения.

class MySwapableArray 
{ 
    bool normal; 
    int array[36]; 


    public: 
     int& operator()(int x, int y) 
     { 
       int h = normal ? x : y; 
       int v = normal ? y : x; 

       return array[h*6+v]; 
     } 
     void swapRowsAndColumns() 
     { 
      normal = ! normal; 
     } 
}; 

Если вы хотите использовать operator[] как A [х] [у], то смотрите: How to overload array index operator for wrapper class of 2D array?

0

шаблон для этого.

template<class X> std::unique_ptr<typename std::pointer_traits<X>::element_type[]> 
transpose(const X& p, int x, int y) { 
    using T = std::pointer_traits<X>::element_type; 
    std::unique_ptr<T[]> r = new T[x*y]; 
    for(int a = 0; a < x; ++a) 
     for(int b = 0; b < y; ++b) 
      r[x*a+b] = p[y*b+a]; 
    return r; 
} 
+0

Отлично! Благодаря!! – JCoder

0

Если вы хотите, чтобы избежать двойной цикл, вы должны быть в состоянии сделать это математически с чем-то вроде

for (int i = 0; i < 36; ++i) { 
    copyarray[6 * (i % 6) + i/6] = array[i] 
} 

В основном, 6 * (i % 6) выравнивает вас в правом ряду в транспонированной матрице, и i/6 (ab) использует целочисленное деление для преобразования значения столбца в значение строки. floor (i/6.0) вернее, если вы можете жить с беспорядком.

Смежные вопросы