注册 登录
编程论坛 C语言论坛

c语言做矩阵转置出现问题?

leizhanzhi 发布于 2020-06-12 13:37, 2343 次点击
C语言做2*3矩阵转置,写一个矩阵转置函数,传入原数组,和一个用于转置之后的数组,在函数中输出没有问题,但是在主函数中,输出转置后的数组元素,最后一行出现乱码
程序代码:
void zhuanzhi(float **a,float **b,int i1,int j1)
{
    int i,j;
    for(i=0;i<i1;i++)
    {
        for(j=0;j<j1;j++)
        {
           b[j][i]=a[i][j];
        }
    }
    for (i=0;i<j1;i++)
    {
        for(j=0;j<i1;j++)
        {
            printf("%f ",b[i][j]);
        }
        printf("\n");
    }
}
int main()
{
  int i,j;
  float a[2][3]={1,2,3,8,5,2},b[3][2];
  float *p[3],*q[2];
  p[0]=a[0],p[1]=a[1],p[2]=a[2];
  q[0]=b[0],q[1]=b[1];
  zhuanzhi(p,q,2,3);
      for (i=0;i<3;i++)
    {
        for(j=0;j<2;j++)
        {
            printf("%f ",b[i][j]);
        }
        printf("\n");
    }
  return 0;
}

运行结果如下:
只有本站会员才能查看附件,请 登录

请前辈帮忙解答一下这是为什么
5 回复
#2
rjsp2020-06-12 14:13
程序代码:
  //float *p[3],*q[2];
  
//p[0]=a[0],p[1]=a[1],p[2]=a[2];
  
//q[0]=b[0],q[1]=b[1];
  float *p[2],*q[3];
  p[0]=a[0],p[1]=a[1];
  q[0]=b[0],q[1]=b[1],q[2]=b[2];

当然,这种做法挺令人不舒服的
#3
lin51616782020-06-12 14:24
float a[2][3]={1,2,3,8,5,2}
,p[2]=a[2];
a没 2

同理 b不止1
#4
leizhanzhi2020-06-12 20:11
回复 2楼 rjsp
新手上路,不太清楚二维数据作为传递参数该怎么传递,请问您一般传二维参数使用哪种方式比较好呢
#5
nanshahyz2020-06-14 09:36
#include <stdio.h>
int main()
{
    int i,j,i1,j1,a[101][101],b[101][101];
    printf("please input the number of rows(<=100)\n");
    scanf("%d",&i1);
    printf("please input the number of columns(<=100)\n");
    scanf("%d",&j1);
    printf("please input the element\n");
    for(i=0;i<i1;i++)
        for(j=0;j<j1;j++)
            scanf("%d",&a[i][j]);
    printf("array a:\n");
    for(i=0;i<i1;i++)
    {
        for(j=0;j<j1;j++)
            printf("\t%d",a[i][j]);
        printf("\n");
    }
    for(i=0;i<i1;i++)
        for(j=0;j<j1;j++)
            b[j][i]=a[i][j];
    printf("array b:\n");
    for(i=0;i<j1;i++)
    {
        for(j=0;j<i1;j++)
            printf("\t%d",b[i][j]);
        printf("\n");
    }
    return 0;
}
#6
rjsp2020-06-15 08:56
以下是引用leizhanzhi在2020-6-12 20:11:24的发言:

新手上路,不太清楚二维数据作为传递参数该怎么传递,请问您一般传二维参数使用哪种方式比较好呢


正儿八经的矩阵运算,得动态分配内存,用一维数组模拟多维数组,因为矩阵运算时很多参数无法在编译时获得。
但仅就你这个“二维数据”的话,那应该直接用“二维数组”,而非什么“指针的数组,指针又指向数组”这种怪胎。
程序代码:
#include <stdio.h>

void matrix_transpose( size_t row, size_t col, const float src[row][col],  float dst[col][row] )
{
    for( size_t r=0; r!=row; ++r )
        for( size_t c=0; c!=col; ++c )
            dst[c][r] = src[r][c];
}

void matrix_print( size_t row, size_t col, float mtx[row][col] )
{
    for( size_t r=0; r!=row; ++r )
        for( size_t c=0; c!=col; ++c )
            printf( "%g%c", mtx[r][c], " \n"[c+1==col] );
}

#define MATRIX_TRANSPOSE(src,dst) matrix_transpose( sizeof(src)/sizeof(*(src)), sizeof(*(src))/sizeof(**(src)), (src), (dst) )
#define MATRIX_PRINT(mtx)         matrix_print( sizeof(mtx)/sizeof(*(mtx)), sizeof(*(mtx))/sizeof(**(mtx)), (mtx) )

int main( void )
{
    float a[2][3] = { {1,2,3}, {8,5,2} };
    float b[3][2];
    MATRIX_TRANSPOSE( a, b );

    MATRIX_PRINT( a );
    MATRIX_PRINT( b );
}
1