C语言 如何转置非方阵?

vmjh9lq9  于 2023-03-12  发布在  其他
关注(0)|答案(7)|浏览(271)

我有这个代码转置矩阵:

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

它似乎对方阵有效,但对非方阵无效。帮帮我!

jecbmhm3

jecbmhm31#

它适用于非方矩阵,但必须确保mat2的行数与mat的列数匹配,反之亦然,即如果matNxM矩阵,则mat2必须是MxN矩阵。

w8rqjzmb

w8rqjzmb2#

这是你在应用程序中使用的实际代码吗?因为它是错误的。
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);
}

这样你就可以动态地初始化一个矩阵,然后你可以像以前一样转置它。

xt0899hw

xt0899hw3#

如果col是mat2中的行数(和mat中的列数),row是mat2中的列数(和mat中的行数),那么这应该有效。
你需要一个额外的 curl ,但我想你已经在你的代码。

h5qlskok

h5qlskok4#

在c++中,具有预定义维数的非方阵转置的代码如下所示:

#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;
  }
}

您可以替换为适当的头文件和print/scan语句,以便用C编写代码,或者从用户那里获取输入并实现相同的代码。

x7rlezfr

x7rlezfr5#

void transpose(int arr[][10] , int rows ,int cols){
   int x = min(rows,cols);   //  minmum of rows or cols; 

   for(int i=0  ; i<rows ; i++){
       for(int j=0 ; j<cols ; j++){
        // first we will transpose the largest square matrix can form i.e(x X x) from given matrix 
        //,and then swap remaining elements

           if(i<x && j<x ){
               if(i<j)
               swap(arr[i][j] , arr[j][i]);
           }
           else {
               swap(arr[i][j] , arr[j][i]);
           }  
       }
   }  
}
dbf7pr2w

dbf7pr2w6#

#include<conio.h>
#include<stdio.h>
main()
    int a[5][5],i,j,t;
    clrscr();
    for(i=1;i<=4;i++)
    { 
        for(j=1;j<=5;j++)
            scanf("%d",&a[i][j]);
    }

    for(i=1;i<=4;i++)
    { 
        for(j=i;j<=5;j++)
        {  
            if(i<=4&&j<=4)
            {
                t=a[j][i];
                a[j][i]=a[i][j];
                a[i][j]=t;
            }
            else
            a[j][i]=a[i][j];
        }
    }

    for(i=1;i<=5;i++)
    {
        for(j=1;j<=4;j++)
        {
            printf("%d ",a[i][j]);
        }
         printf("\n");
    }

    getch();
}
bxgwgixi

bxgwgixi7#

#include<conio.h>
  #include<ctype.h>
 #include<iostream.h>
 void trans(int [][10], int , int );
 int main()
 {
     int a[10][10],n,m,i,j;
  clrscr();
  cout<<"Enter the no. of rows and Columns: ";
  cin>>n>>m;
  cout<<"\n Enter the Matrix now:";
  for(i=0;i<n;i++)
   for(j=0;j<m;j++)
     cin>>a[i][j];  
  trans(a,n,m);
  getch();
  return 0;
 }
 void trans( int a[][10] , int n , int m )
 {  
   int i,b[10][10],j;
    for(i=0;i<n;i++)
     for(j=0;j<m;j++)
      { 
       b[j][i]=a[i][j];
      }
     cout<<"\n\nSize before Transpose "<<n<<"x"<<m<<"\n\n";
     for(i=0;i<m;i++)
       {
         for(j=0;j<n;j++)
          cout<<b[i][j]<<"\t";
     cout<<"\n";
      }
  cout<<"\n\nSize after transpose "<<m<<"x"<<n;  
   }

相关问题