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

目录

一:知识点

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进行这样的赋值。

三:小总结

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

posted @   C_Ryson  阅读(112)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示