Как транспонировать неквадратную матрицу?

У меня есть этот код для транспонирования матрицы:

for(j=0; j<col; j++) { 
    for(k=0; k<row; k++) {
        mat2[j][k] = mat[k][j];
    }

Кажется, он работает с квадратной матрицей, но не с неквадратной матрицей. Помоги мне!


person user420360    schedule 25.08.2010    source источник
comment
Что значит не работает?   -  person kennytm    schedule 25.08.2010
comment
Что значит не работает? Он падает? Ничего не делает? Помогите нам помочь вам!   -  person Dr. Snoopy    schedule 25.08.2010
comment
надеюсь, вы выделили массивы правильных размеров. @ все, что я знаю, это должен быть комментарий. но у меня недостаточно очков репутации для этого :|   -  person Rahul    schedule 25.08.2010


Ответы (5)


Это будет работать для неквадратной матрицы, но вы должны убедиться, что количество строк в mat2 соответствует количеству столбцов в mat, и наоборот. То есть, если mat является матрицей NxM, то mat2 должна быть матрицей MxN.

person Jerry Coffin    schedule 25.08.2010

Это фактический код, который вы использовали в своем приложении? Потому что это неправильно.
Синтаксис оператора for таков:

for (Initialization; Condition to continue with the loop; Step Operation) {}

В вашем случае вы должны использовать что-то вроде этого:

#define COLS 10
#define ROWS 5

int mat[COLS][ROWS];
int mat2[ROWS][COLS];

int i, j;

for (i = 0; i < COLS; i ++) {
    for (j = 0; j < ROWS; j++) {
        mat2[j][i] = mat[i][j];
    }
}

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

int ** mat;
int ** mat2;

int cols, rows;
int i, j;

/* Get matrix dimension from the user */

mat = (int **) malloc (sizeof(int *) * cols);

for (i = 0; i < cols; i++) {
    mat[i] = (int *) malloc (sizeof(int) * rows);
}

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

person Jazzinghen    schedule 25.08.2010
comment
О, я видел, что вы обновили свой код. Вторая часть ответа может помочь... - person Jazzinghen; 25.08.2010

Если col — это количество строк в mat2 (и столбцов в mat), а row — это количество столбцов в mat2 (и строк в mat), то это должно работать.

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

person Lou Franco    schedule 25.08.2010

Код для транспонирования неквадратной матрицы с предопределенными размерами в С++ будет выглядеть примерно так:

#include <iostream>

using namespace std;

int main()
{
int a[7][6],b[6][7],x,i,j,k;
/*Input Matrix from user*/
cout<<"Enter elements for matrix A\n";
for(i=0;i<7;i++)
    {for(j=0;j<6;j++)
       {
         cin>>a[i][j];
       }
    }
 /*Print Input Matrix A*/
 cout<<"MATRIX A:-"<<endl;
 for(i=0;i<7;i++)
    {for(j=0;j<6;j++)
       {
         cout<<a[i][j];
       }
       cout<<endl;
    }
/*calculate TRANSPOSE*/
for(i=0;i<7;i++)
    {for(j=0,k=5;j<6;j++,k--)
        {
         x=j+(k-j);
         b[x][i]=a[i][j];
        }
    }
/*Print Output Matrix B*/
cout<<"matrix B:-\n";
for(i=0;i<6;i++)
  {for(j=0;j<7;j++)
   {
       cout<<b[i][j];
   }
   cout<<endl;
  }
}

Вы можете заменить их соответствующими операторами заголовка и печати/сканирования, чтобы написать код на C, а также получить ввод от пользователя и реализовать то же самое.

person Abhishek Mehrotra    schedule 10.01.2013

person    schedule
comment
Пожалуйста, дайте объяснение. - person gaganso; 15.06.2016