【万人千题】C语言矩阵的转置12.4总结

本文介绍了如何在C语言中实现矩阵转置,包括理解矩阵转置的概念,使用额外数组或原地转置的方法,并提供了LeetCode上的相关习题作为实例。重点讲述了通过两层循环交换元素来完成转置的过程,同时讲解了动态内存分配在创建二维矩阵中的应用。

目录

一:知识点

1,概念

二:应用

1,另开一个数组来存放转置内容。(row和col不等的情况)

2,n阶矩阵(row与col相等的情况)

二:习题 

867. 转置矩阵 - 力扣(LeetCode) (leetcode-cn.com)

用malloc申请二维矩阵

三:小总结


一:知识点

1,概念

矩阵,在C语言中可以使用二维数组来表示,于是对于矩阵的一些运算,也可以用二维数组来进行。

矩阵的转置实际上就是将矩阵的行元素和列元素以主对角线为对称轴进行交换,如 

12
34

主对角线为1,4.那么对其进行转置实际上就是将2和3对换。实际上也就是行列的交换.交换完如下:

13
24

二:应用

1,另开一个数组来存放转置内容。(row和col不等的情况)

那么,在实际应用中该如何使用?首先矩阵是row行,col列的一个二维数组,那么转置的时候实际上也就是将行元素与列元素进行交换。或者说将矩阵的上三角元素与下三角元素进行交换。矩阵的元素可以表示为matrix[ i ][ j ],我们在使用循环来解决矩阵问题时是两层循环嵌套那么必有一个是先不变的,我们假设让 i 在 j 循环中改变得比j慢,那么这时候表示行元素就是matrix[ i ][ j ],而列元素我们直到是行在改变,于是我们可以使用matrix[ j ][ i ]来表示列元素,将两个元素交换,直到遍历完整个数组即可。

2,n阶矩阵(row与col相等的情况)

这时候,因为数组转置后行列都不变,可以在原数组中进行操作

void swap(int** arr,int row,int col)
{
    for(i=0;i<row;i++)
    {
      for(j=i;j<col;j++)
        {
           int tmp=arr[i][j];
           arr[i][j]=arr[j][i];
           arr[j][i]=tmp;
        }
    }
 
}

这里需要注意的是,j一定要等于i,因为是根据主对角线来进行转置,所以,每次转置的起点实际上就在主对角线上的元素,如果j仍然从0开始,那么除了第一次之外,每次行元素都会比列元素多。 

二:习题 

867. 转置矩阵 - 力扣(LeetCode) (leetcode-cn.com)

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes)
{
       int row=matrixSize;
       int col=matrixColSize[0];
       int** ans=(int**)malloc(sizeof(int*)*col);
           *returnSize = col;
    *returnColumnSizes = (int*)malloc(sizeof(int)*col);
       int i=0;
       for(i=0;i<col;i++)
        {
            ans[i]=(int*)malloc(sizeof(int)*row);
            (*returnColumnSizes)[i]=row;
        }
       int j=0;
       for(i=0;i<row;i++)
       {
           for(j=0;j<col;j++)
           {
             ans[j][i]=matrix[i][j];
           }
       }
       return ans;
}

这里主要用到的就是上述方法,将其行列元素在嵌套循环中交换完毕即可出结果。

这里还想总结一个点:

用malloc申请二维矩阵

int**arr=(int**)malloc(sizeof(int*)*row);
int i=0;
for(i=0;i<row;i++)
arr[i]=(int*)malloc(sizeof(int)*col);

先申请一块空间来存放int*也就是row行,之后对arr[ i ]中每个行元素进行初始化,让其拥有col个int的空间。不要忘记是对每个行都需要初始化开辟空间。还有一个点是,如果在leetcode中做题,有int**returncolsize的话,也需要对每个returncolsize进行这样的赋值。

三:小总结

对于矩阵的转置实际上要找到规律,找到之后就可以做出来。大家一起继续加油吧。感谢看到这里的小伙伴啦。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值