矩阵(稀疏矩阵)的转置算法(C语言)详解
矩阵(包括稀疏矩阵)的转置,即互换矩阵中所有元素的行标和列标,如图 1 所示:

图 1 矩阵转置示意图
但如果想通过程序实现矩阵的转置,互换行标和列标只是步。因为实现矩阵转置的前提是将矩阵存储起来,数据结构中提供了 3 种存储矩阵的结构,分别是三元组顺序表、行逻辑链接的顺序表和十字链表。如果采用前两种结构,矩阵的转置过程会涉及三元组表也跟着改变的问题,如图 2 所示:

图 2 三元组表的变化
图 2a) 表示的是图 1 中转置之前矩阵的三元组表,2b) 表示的是图 1 中矩阵转置后对应的三元组表。
不仅如此,如果矩阵的行数和列数不等,也需要将它们互换。因此通过以上分析,矩阵转置的实现过程需完成以下 3 步:
将矩阵的行数和列数互换;
将三元组表(存储矩阵)中的 i 列和 j 列互换,实现矩阵的转置;
以 j 列为序,重新排列三元组表中存储各三元组的先后顺序;
此 3 步中,前两步比较简单,关键在于一步的实现。本节先介绍较容易的一种。
矩阵转置的实现思路是:不断遍历存储矩阵的三元组表,每次都取出表中 j 列最小的那一个三元组,互换行标和列标的值,并按次序存储到一个新三元组表中,。
例如,将图 2a) 三元组表存储的矩阵进行转置的过程为:
新建一个三元组表(用于存储转置矩阵),并将原矩阵的行数和列数互换赋值给新三元组;
遍历三元组表,找到表中 j 列最小值 1 所在的三元组 (3,1,6),然后将其行标和列标互换后添加到一个新的三元组表中,如图 3 所示:

图 3 矩阵转置的个过程继续遍历三元组表,找到表中 j 列次小值为 2 的三元组,分别为 (1,2,1)、(2,2,3) 和 (3,2,5),根据找到它们的先后次序将各自的行标和列标互换后添加到新三元组表中,如图 4 所示:

图 4 矩阵转置的第二个过程
对比图 4 和图 2b) 可以看到,矩阵被成功地转置。
因此,矩阵转置的 C 语言实现代码为:
#include<stdio.h>
#define number 10
typedef struct {
int i, j;
int data;
}triple;
typedef struct {
triple data[10];
int n, m, num;
}Tatrix;
Tatrix transposeMatrix(Tatrix M, Tatrix T) {
T.m = M.n;
T.n = M.m;
T.num = M.num;
if (T.num) {
int q = 0;
for (int col = 1; col <= M.m; col++) {
for (int p = 0; p < M.num; p++) {
if (M.data[p].j == col) {
T.data[q].i = M.data[p].j;
T.data[q].j = M.data[p].i;
T.data[q].data = M.data[p].data;
q++;
}
}
}
}
return T;
}
int main() {
Tatrix M;
M.m = 2;
M.n = 3;
M.num = 4;
M.data[0].i = 1;
M.data[0].j = 2;
M.data[0].data = 1;
M.data[1].i = 2;
M.data[1].j = 2;
M.data[1].data = 3;
M.data[2].i = 3;
M.data[2].j = 1;
M.data[2].data = 6;
M.data[3].i = 3;
M.data[3].j = 2;
M.data[3].data = 5;
Tatrix T;
for (int k = 0; k < number; k++) {
T.data[k].i = 0;
T.data[k].j = 0;
T.data[k].data = 0;
}
T = transposeMatrix(M, T);
for (int i = 0; i < T.num; i++) {
printf("(%d,%d,%d)\n", T.data[i].i, T.data[i].j, T.data[i].data);
}
return 0;
}
程序运行结果为:
(1,3,6)
(2,1,1)
(2,2,3)
(2,3,5)
由于此算法中嵌套使用了两个 for 循环,时间复杂度为O(n2)。- 随机文章
- 影后 马尔代夫 医院(马尔代夫影后就医:健康是真正的胜利)
- 马尔代夫马累新闻(马尔代夫马累:度假胜地现负面影响)
- 中国也有马尔代夫(中国涌现马尔代夫,旅游热点逐渐受宠)
- 美国马尔代夫群岛(美国与马尔代夫合作扩大岛屿保护区)
- 连江 马尔代夫(连江游客返台曝受挫 马尔代夫疫情再起迫取消行程)
- 马尔代夫 印度出兵(印度向马尔代夫派兵,协助维护安全(40))
- 搜狐宜兴马尔代夫(搜狐宜兴:探寻马尔代夫的美丽和神秘)
- 沈阳马尔代夫现状(沈阳马尔代夫旅游如何?探寻真实面貌)
- 莱西 马尔代夫(「莱西游客在马尔代夫被困」)
- 鲷鱼 马尔代夫(鲷鱼游马尔代夫:珊瑚海底漫步)
- 抚顺马尔代夫在哪(抚顺有一个马尔代夫,你知道在哪吗?)
- 玉林马尔代夫收费(玉林将向马尔代夫游客收取额外旅游费)
- 浪漫马尔代夫婚礼(浪漫登记马尔代夫,人生一场爱情盛宴)
- 川航 马尔代夫(川航新增马尔代夫航班助力旅游业反弹)
- 沙屋 马尔代夫(马尔代夫新奇度假体验:尝试居住沙屋)
- 中国 马尔代夫 进球集锦(中国 vs 马尔代夫:精彩进球集锦回顾)
- 重庆马尔代夫摄影(重庆摄影师带你领略“马尔代夫”风光)
- 重庆马尔代夫钓鱼(重庆游客在马尔代夫遭遇钓鱼团坑骗。)
- 马尔代夫不带美金(马尔代夫采用本币付款,美金不再通用)
- 沧州马尔代夫地址(沧州有一个马尔代夫,这就是它的地址)
- 北方 马尔代夫(马尔代夫珍贵海洋自然资源亟待保护)
- 马尔代夫上岛工具(马尔代夫岛屿探索必备:上岛工具推荐)
- 马尔代夫住宿便宜(马尔代夫度假住宿预算足够,物有所值)
- 足彩马尔代夫中国(中国足球队将在马尔代夫展开足彩比赛)
- 廊坊 马尔代夫(廊坊市民花式骑行赴马尔代夫,成为旅游新热点)
- 马尔代夫卡海龟岛(马尔代夫卡海龟岛:海洋生态保护之旅)
- 中旅 马尔代夫(探秘马尔代夫:旅游胜地的不止是美丽风光)
- 马尔代夫单人报团(独自前往马尔代夫:单人旅行圆梦之选)
- 国旅 马尔代夫(国旅推出马尔代夫旅游新品,度假首选之地)
- 马尔代夫农场图片(惊艳!马尔代夫农场美景犹如童话世界)
