linux矩阵设备代码,C语言矩阵转置代码及解析

问题描述

编写一个程序,将一个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:

a6d2b34a00bce886afde896b4e92e8fa.gif

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

88e12c5d2c7d25c35b777462ef196887.gif

算法设计

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

以问题分析中提到的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

a120be9cd7dcbfa8d41ecf513b9a8152.png

知识点补充

已知有一个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列

88da0fb0459ea74dd1630efa2059a647.png

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
稀疏矩阵转置是指将一个稀疏矩阵按照行列互换的方式变换成另一个稀疏矩阵。下面是一个使用 C 语言实现稀疏矩阵转置代码示例: ```c #include <stdio.h> #define MAX_TERMS 101 #define MAX_COL 101 typedef struct { int row; int col; int value; } term; void fast_transpose(term a[], term b[]); int main() { term a[MAX_TERMS], b[MAX_TERMS]; int m, n, num_terms; printf("Enter the number of rows and columns in the matrix: "); scanf("%d %d", &m, &n); printf("Enter the number of non-zero elements in the matrix: "); scanf("%d", &num_terms); printf("Enter the non-zero elements of the matrix:\n"); for (int i = 0; i < num_terms; i++) { scanf("%d %d %d", &a[i].row, &a[i].col, &a[i].value); } fast_transpose(a, b); printf("The original matrix is:\n"); for (int i = 0; i < num_terms; i++) { printf("%d %d %d\n", a[i].row, a[i].col, a[i].value); } printf("The transpose matrix is:\n"); for (int i = 0; i < num_terms; i++) { printf("%d %d %d\n", b[i].row, b[i].col, b[i].value); } return 0; } void fast_transpose(term a[], term b[]) { int row_terms[MAX_COL]; int starting_pos[MAX_COL]; int num_cols = a[0].col; int num_terms = a[0].value; b[0].row = num_cols; b[0].col = a[0].row; b[0].value = num_terms; if (num_terms > 0) { for (int i = 0; i < num_cols; i++) { row_terms[i] = 0; } for (int i = 1; i <= num_terms; i++) { row_terms[a[i].col]++; } starting_pos[0] = 1; for (int i = 1; i < num_cols; i++) { starting_pos[i] = starting_pos[i-1] + row_terms[i-1]; } for (int i = 1; i <= num_terms; i++) { int j = starting_pos[a[i].col]++; b[j].row = a[i].col; b[j].col = a[i].row; b[j].value = a[i].value; } } } ``` 该程序通过定义 `term` 结构体来存储稀疏矩阵的非零元素,使用 `fast_transpose` 函数来实现稀疏矩阵转置,通过读取用户输入的行数、列数和非零元素的数量,将原始稀疏矩阵存储在 `a` 数组中,并将转置后的稀疏矩阵存储在 `b` 数组中,最后输出原始矩阵和转置后的矩阵
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值