矩阵转置问题
2022年 02月 12 日

BIGFISH

矩阵例题链接:5*5矩阵转置例题

 

问题描述

编写一个程序,将一个3行3列的矩阵转置。

问题分析

要解决该问题应该清楚什么是矩阵的转置。矩阵转置在数学上的定义为:设A为m×n阶矩阵(即m行n列的矩阵),其第i行第j列的元素是a(i,j),即:

A=a(i,j)m×n

定义A的转置为这样一个n×m阶矩阵B,满足:

B=a(j,i)m×n

即b(i,j)=a(j,i)(B的第 i行第j列元素是A的第j行第i列元寒),记为A’=B。

假设有如下的矩阵A:

则经过转置后,即将矩阵的第i行变成了现在的第i列,则原来的矩阵A变为如下矩阵B:

算法设计

解决矩阵问题时通常都是先将矩阵存放在一个二维数组中,而当矩阵发生变化时,二维数组中的对应元素也会发生变化。

以问题分析中提到的A矩阵为例,要实现A的转置,首先应将其存放在一个二维数组n中,该二维数组中的元素及其内容如表A所示。

n[0][0] n[0][1] n[0][2]
1 2 3
n[1][0] n[1][1] n[1][2]
4 5 6
n[2][0] n[2][1] n[2][2]
7 8 9

将A转置后,二维数组中元素的内容会发生变化。A转置后,二维数组n中的元素内容如表B所示。

n[0][0] n[0][1] n[0][2]
1 4 7
n[1][0] n[1][1] n[1][2]
2 5 8
n[2][0] n[2][1] n[2][2]
3 6 9

转置后矩阵主对角线上的数组元素n[0][0]、n[1][1]、n[2][2]的值并没有发生变化,只是位于对角线右上方的三个元素与位于对角线左下方的三个元素的值进行了交换。具体为:n[0][1]与n[1][0]进行了交换,n[0][2]与n[2][0]进行了交换,n[1][2]与进行了交换。

根据这个发现就可以来设计算法,在对一个3x3阶矩阵转置时,只需将主对角线右上方的数组元素n[0][1]、n[0][2]、n[1][2],分别与主对角线左下放的数组元素n[1][0]、n[2][0]、n[2][1]的值,通过一个临时变量进行交换即可,总共只要进行3次交换就可以实现矩阵的转置。

 

#include
int main()
{
    int n[3][3]={1, 2, 3, 4, 5, 6, 7, 8, 9};
    int i, j, temp;
    printf("原始矩阵:\n");
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
            printf("%d  ", n[i][j]);  /*输出原始矩阵*/
        printf("\n");
    }
    for(i=0; i<3; i++)
        for(j=0; j<3; j++) { if (j>i)
            {  /*将主对角线右上方的数组元素与主对角线左下方的数组元素进行单方向交换*/
                temp=n[i][j];
                n[i][j]=n[j][i];
                n[j][i]=temp;
            }
        }
    printf("转置矩阵:\n");
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
            printf("%d  ", n[i][j]);  /*输出原始矩阵的转置矩阵*/
        printf("\n");
    }
    return 0;
}

运行结果:

原始矩阵:
1 2 3
4 5 6
7 8 9
转置矩阵:
1 4 7
2 5 8
3 6 9

 

知识点补充

已知有一个3×4的矩阵,要求编程求出其中值最大的那个元素所在的行号和列号及该元素的值。

显然,要解决这个问题必须要遍历矩阵中的每个元素,因此,程序的结构就是一个双重的for循环,在循环体中进行的就是矩阵元素的比较,找出最大元素。

下面是完整的代码:

 

#include
int main()
{
    int i, j, row=0, column=0,max;
    int a[3][4]={{2, 7, 3, 6}, {8, 1, 9, 5}, {10, 4, 2, 5}};
    max=a[0][0];  /*设置max的初值*/
    /*矩阵中每一个元素逐一与max进行比较*/
    for(i=0; i<=2; i++)
        for(j=0; j<=3; j++) if(a[i][j]>max)
            {
                max=a[i][j];
                row=i;
                column=j;
            }
    printf("矩阵的最大值为:%d,其所在行为第%d行,所在列为第%d列\n", max, row, column);
    return 0;
}

 

运行结果:
矩阵的最大值为:10,其所在行为第2行,所在列为第0列

矩阵转置问题

矩阵例题链接:5*5矩阵转置例题

 

问题描述

编写一个程序,将一个3行3列的矩阵转置。

问题分析

要解决该问题应该清楚什么是矩阵的转置。矩阵转置在数学上的定义为:设A为m×n阶矩阵(即m行n列的矩阵),其第i行第j列的元素是a(i,j),即:

A=a(i,j)m×n

定义A的转置为这样一个n×m阶矩阵B,满足:

B=a(j,i)m×n

即b(i,j)=a(j,i)(B的第 i行第j列元素是A的第j行第i列元寒),记为A’=B。

假设有如下的矩阵A:

则经过转置后,即将矩阵的第i行变成了现在的第i列,则原来的矩阵A变为如下矩阵B:

算法设计

解决矩阵问题时通常都是先将矩阵存放在一个二维数组中,而当矩阵发生变化时,二维数组中的对应元素也会发生变化。

以问题分析中提到的A矩阵为例,要实现A的转置,首先应将其存放在一个二维数组n中,该二维数组中的元素及其内容如表A所示。

n[0][0] n[0][1] n[0][2]
1 2 3
n[1][0] n[1][1] n[1][2]
4 5 6
n[2][0] n[2][1] n[2][2]
7 8 9

将A转置后,二维数组中元素的内容会发生变化。A转置后,二维数组n中的元素内容如表B所示。

n[0][0] n[0][1] n[0][2]
1 4 7
n[1][0] n[1][1] n[1][2]
2 5 8
n[2][0] n[2][1] n[2][2]
3 6 9

转置后矩阵主对角线上的数组元素n[0][0]、n[1][1]、n[2][2]的值并没有发生变化,只是位于对角线右上方的三个元素与位于对角线左下方的三个元素的值进行了交换。具体为:n[0][1]与n[1][0]进行了交换,n[0][2]与n[2][0]进行了交换,n[1][2]与进行了交换。

根据这个发现就可以来设计算法,在对一个3x3阶矩阵转置时,只需将主对角线右上方的数组元素n[0][1]、n[0][2]、n[1][2],分别与主对角线左下放的数组元素n[1][0]、n[2][0]、n[2][1]的值,通过一个临时变量进行交换即可,总共只要进行3次交换就可以实现矩阵的转置。

 

#include
int main()
{
    int n[3][3]={1, 2, 3, 4, 5, 6, 7, 8, 9};
    int i, j, temp;
    printf("原始矩阵:\n");
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
            printf("%d  ", n[i][j]);  /*输出原始矩阵*/
        printf("\n");
    }
    for(i=0; i<3; i++)
        for(j=0; j<3; j++) { if (j>i)
            {  /*将主对角线右上方的数组元素与主对角线左下方的数组元素进行单方向交换*/
                temp=n[i][j];
                n[i][j]=n[j][i];
                n[j][i]=temp;
            }
        }
    printf("转置矩阵:\n");
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
            printf("%d  ", n[i][j]);  /*输出原始矩阵的转置矩阵*/
        printf("\n");
    }
    return 0;
}

运行结果:

原始矩阵:
1 2 3
4 5 6
7 8 9
转置矩阵:
1 4 7
2 5 8
3 6 9

 

知识点补充

已知有一个3×4的矩阵,要求编程求出其中值最大的那个元素所在的行号和列号及该元素的值。

显然,要解决这个问题必须要遍历矩阵中的每个元素,因此,程序的结构就是一个双重的for循环,在循环体中进行的就是矩阵元素的比较,找出最大元素。

下面是完整的代码:

 

#include
int main()
{
    int i, j, row=0, column=0,max;
    int a[3][4]={{2, 7, 3, 6}, {8, 1, 9, 5}, {10, 4, 2, 5}};
    max=a[0][0];  /*设置max的初值*/
    /*矩阵中每一个元素逐一与max进行比较*/
    for(i=0; i<=2; i++)
        for(j=0; j<=3; j++) if(a[i][j]>max)
            {
                max=a[i][j];
                row=i;
                column=j;
            }
    printf("矩阵的最大值为:%d,其所在行为第%d行,所在列为第%d列\n", max, row, column);
    return 0;
}

 

运行结果:
矩阵的最大值为:10,其所在行为第2行,所在列为第0列

赞 (0)

猜您想看

评论区(1条评论)

我要评论


5*5矩阵转置例题 - 大鱼

[…] 将5*5的矩阵A转置(即行变列,列变行),并将行列互换即转置 前、后的矩阵分别打印出来。 下面程序中存在比较隐蔽的错误, 请通过分析和调试程序,发现并改正程序中的错误。 注意:请将修改正确后的完整源程序拷贝粘贴到答题区内。 对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。 当且仅当错误全部改正,且程序运行结果调试正确,才得满分。 矩阵知识点链接:矩阵转置问题 […]