编写函数将一个M * N的矩阵转置成 N * M 的矩阵

任务描述

本关任务:编写函数将一个M * N的矩阵转置成一个N * M的矩阵,要求定义函数分别进行二维数组输入、输出和转置。

相关知识

M * N个数排成的MN列的数表称为MN列的矩阵,简称 M * N矩阵,在编程语言中可以当做二维数组来处理。

转置:把矩阵A的行换成同序数的列所得到的新矩阵B称为A的转置矩阵。

定义两个二维数组如下:

 
 
  1. int a[M][N],b[N][M];

如果3*5的矩阵A的值如下 : 55 8 74 66 23 32 12 1 36 58 94 45 56 88 31 那么矩阵A的转置矩阵B的值如下 : 55 32 94 8 12 45 74 1 56 66 36 88 23 58 31 MN有可能相等,也有可能不相等,针对二维数组不同的列数,定义不同的输出二维数组的函数:

 
 
  1. void Output1(int (*b)[M],int m,int n)
  2. {
  3. int i,j;
  4. for(i=0;i<m;i++)
  5. {
  6. for(j=0;j<n;j++)
  7. printf("%d\t",*(*(b+i)+j));
  8. printf("\n");
  9. }
  10. }
  11. void Output2(int (*b)[N],int m,int n)
  12. {
  13. int i,j;
  14. for(i=0;i<m;i++)
  15. {
  16. for(j=0;j<n;j++)
  17. printf("%d\t",*(*(b+i)+j));
  18. printf("\n");
  19. }
  20. }

编程要求

根据提示,在右侧编辑器 Begin-End 区间补充代码,编写函数输入一个3 * 5的矩阵,转置成一个5 * 3的矩阵,具体要求如下:

  • 函数 input() 实现二维数组的输入;
  • 函数 reverse() 实现二维数组的转置;
  • 函数 output2() 实现转置前二维数组的输出;
  • 函数 output1() 实现转置后二维数组的输出;
  • 函数 main() 定义变量并调用以上子函数。

测试说明

平台会对你编写的代码进行测试。

测试输入: 55 8 74 66 23 32 12 1 36 58 94 45 56 88 31

输入说明:输入15个整数。

预期输出: 55 8 74 66 23 32 12 1 36 58 94 45 56 88 31 55 32 94 8 12 45 74 1 56 66 36 88 23 58 31

输出说明: 首先输出35列的矩阵A; 再输出53列矩阵B,为矩阵A的转置矩阵,相邻两个整数之间用单个空格隔开。


开始你的任务吧,祝你成功!

数组传递的方法

#include <stdio.h>
#define M 3
#define N 5

void Input(int a[][N], int m, int n);
void reverse(int a[][N], int b[][M]);
void Output1(int a[][N], int m, int n);
void Output2(int a[][M], int m, int n);

int main()
{
    int RowC[M][N], RowCT[N][M], r = M, c = N;
    Input(RowC, r, c);
    reverse(RowC, RowCT);
    Output1(RowC, r, c);
    Output2(RowCT, c, r);

    return 0;
}

void Input(int a[][N], int m, int n)
{
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
}

void reverse(int a[][N], int b[][M])
{
    for (int i = 0; i < M; i++)
    {
        for (int j = 0; j < N; j++)
        {
            b[j][i] = a[i][j];
        }
    }
}

void Output1(int a[][N], int m, int n)
{
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }
}

void Output2(int a[][M], int m, int n)
{
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }
}

指针传递 的方法 

#include <stdio.h>
#include <stdlib.h> // 添加头文件以使用动态内存分配函数

#define M 3
#define N 5

void Input(int (*a)[N], int m, int n);
void reverse(int (*a)[N], int (*b)[M], int m, int n);
void Output1(int (*a)[N], int m, int n);
void Output2(int (*a)[M], int m, int n);

int main()
{
    int (*RowC)[N], (*RowCT)[M], r = M, c = N;

    // 动态分配内存给RowC和RowCT
    RowC = malloc(r * sizeof(*RowC));
    RowCT = malloc(c * sizeof(*RowCT));

    // 分配内存后,检查内存分配是否成功
    if (RowC == NULL || RowCT == NULL)
    {
        printf("内存分配失败\n");
        return 1;
    }

    Input(RowC, r, c);
    reverse(RowC, RowCT, r, c);
    Output1(RowC, r, c);
    Output2(RowCT, c, r);

    // 释放动态分配的内存
    free(RowC);
    free(RowCT);

    return 0;
}

void Input(int (*a)[N], int m, int n)
{
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
}

void reverse(int (*a)[N], int (*b)[M], int m, int n)
{
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            b[j][i] = a[i][j];
        }
    }
}

void Output1(int (*a)[N], int m, int n)
{
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}

void Output2(int (*a)[M], int m, int n)
{
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}

 

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用两层循环,遍历原矩阵的每一个元素,将其转置到新矩阵的对应位置上。具体实现如下: def transpose(matrix): m = len(matrix) n = len(matrix[0]) new_matrix = [[0] * m for _ in range(n)] for i in range(m): for j in range(n): new_matrix[j][i] = matrix[i][j] return new_matrix 其中,m和n分别表示原矩阵数和数,new_matrix是转置后的新矩阵,初始化为全0矩阵。在两层循环中,i和j分别表示原矩阵中的,将原矩阵中的元素matrix[i][j]转置到新矩阵的对应位置new_matrix[j][i]上。最后返回新矩阵即可。 ### 回答2: 矩阵转置是将矩阵交换,因此可以先创建一个新的n*m的矩阵,再将原矩阵中的元素按照的顺序填入新矩阵中。 以下是一个Python函数的示例代码: ```python def transpose_matrix(matrix): m = len(matrix) n = len(matrix[0]) transposed = [[0] * m for i in range(n)] for i in range(m): for j in range(n): transposed[j][i] = matrix[i][j] return transposed ``` 该函数接受一个m*n的矩阵作为参数,返回一个n*m的转置矩阵。首先获取矩阵数m和数n,然后创建一个n*m的全0矩阵,用于存储转置后的矩阵。接下来使用两个循环遍历原矩阵中的每个元素,按照的顺序填入转置矩阵中,最后返回转置矩阵。 例如,对于以下矩阵: ``` 1 2 3 4 5 6 ``` 应用该函数后,可以得到转置矩阵: ``` 1 4 2 5 3 6 ``` 可以用该函数实现很多矩阵相关的问题,例如矩阵乘法和矩阵求逆等。 ### 回答3: 矩阵转置是指将矩阵互换得到一个新的矩阵。设原矩阵为A,转置后的矩阵为B,则对于任意的i和j,B_ij = A_ji。为了实现转置,我们需要编写一个函数。 此函数可以采用二维数组来存储矩阵,其基本思路如下: 1. 创建一个n*m的新矩阵B,存储将要转置后的数据; 2. 使用两个循环,分别控制原矩阵A的; 3. 将A的第i第j的数据赋值给B的第j第i; 4. 最后返回转置后的矩阵B。 以下是实现代码: ```python def transpose_matrix(A): m, n = len(A), len(A[0]) B = [[0 for _ in range(m)] for _ in range(n)] for i in range(m): for j in range(n): B[j][i] = A[i][j] return B ``` 上述代码中,我们首先确定了原矩阵A的数和数,创建了一个矩阵B,并将其初始化为全0。 然后,我们使用两个循环,遍历原矩阵A的每个元素。对于A中的第i第j的元素,我们将其赋值到新矩阵B的第j第i。 最后,我们返回新矩阵B,这就是原矩阵A转置后得到的矩阵

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IcarusCPU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值