矩阵快速转置
2017-11-21 21:23
253 查看
#include<stdlib.h> #include<stdio.h> typedef struct { int r; int c; int d=0; }TupNode;//定义每个非零元素对应的三元数组 typedef struct { int rows; int cols; int nums;//非零元素个数 TupNode data[500]; }TSMatrix;//三元组顺序表,用顺序表(每个元素是三元组)来存储稀疏矩阵 //创建 /*void CreatMat(TSMatrix &t, int A[M] ) { int i, j; t.rows = M; t.cols = N; t.nums = 0; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { if (A[i][j] != 0) { t.data[t.nums++] = { i,j,A[i][j] }; //t.data[t.nums].r=i; //t.data[t.nums].c=j; //t.data[t.nums].d=A[i][j]; //t.nums++; } } } }*/ //赋值 bool Value(TSMatrix &t, int x, int i, int j) { if (i < 0 || i >= t.rows || j < 0 || j >= t.cols) { return false; } else { int m, q, k; /*for (m = 0; m < t.nums; m++) { //修改已有值 if (t.data[m].r ==i&&t.data[m].c == j) { t.data[m].d = x; return true; } else if (t.data[m].r > i&&t.data[m].c > j) { for (k = t.nums; k >= (m + 1); k--) { t.data[k] = t.data[k - 1]; } t.data[m] = { i,j,x }; t.nums++; ) } /*t.data[t.nums++] = { i,j,x }; return true;*/ k = 0; while (k<t.nums&&i>t.data[k].r) k++; while (k<t.nums&&i == t.data[k].r&&j>t.data[k].c)k++; if (t.data[k].r == i&&t.data[k].c == j) { t.data[k].d = x; } else { } } } //将指定位置元素赋值给一个变量 bool Assign(TSMatrix t, int &X, int i, int j) { if (i >= t.rows || j >= t.cols) return false;//超界了 int k = 0; /*for (k = 0; k < t.nums; k++) { //能找到说明是非零 if (t.data[k].r == i&&t.data[k].c == j) { X = t.data[k].d; return true; } while() }*/ //查找行 while (k < t.nums&&i>t.data[k].r) k++;//一定是>=i,没有的话就是最近的大的 while (k<t.nums&&i == t.data[k].r&& j>t.data[k].c) k++; if (t.data[k].r == i&&t.data[k].c == j) { X = t.data[k].d; } else { X = 0; } return true; } //输出 //转置 //粗糙的算法O(nt) void Tran(TSMatrix t, TSMatrix &tb) { int q = 0, v; tb.rows = t.cols; tb.cols = t.rows; tb.nums = t.nums; int k = 0; int p = 0; if (t.nums != 0) { for (p = 0; p < t.cols; p++) { for (q = 0; q < t.nums; q++) { if (t.data[q].c == p) { tb.data[k].r = t.data[q].c; tb.data[k].c = t.data[q].r; tb.data[k].d = t.data[q].d; k++; } } } } } int min = 10000; int num[500]; int cpot[500] ; //十字链表表示稀疏矩阵 int main() { int i = 0, j, k, m, n; TSMatrix ta, tb, t; scanf("%d %d %d", &ta.rows, &ta.cols, &ta.nums); int min = 10000; for (i = 0; i < ta.nums; i++) { scanf("%d %d %d", &ta.data[i].r, &ta.data[i].c, &ta.data[i].d); num[ta.data[i].c]++; if (ta.data[i].c < min) { min = ta.data[i].c; } } cpot[1] = 1; for (i =2; i <=ta.cols; i++) { cpot[i] = cpot[i - 1] + num[i - 1]; } tb.rows = ta.cols; tb.cols = ta.rows; tb.nums = ta.nums; for (i = 0; i < ta.nums; i++) { int cc = ta.data[i].c; int q = cpot[cc]; while (tb.data[q].d != 0) { q++; } tb.data[q].c = ta.data[i].r; tb.data[q].r = ta.data[i].c; tb.data[q].d = ta.data[i].d; } printf("num:"); for (i = 1; i <=ta.cols; i++) { printf("%d,", num[i]); } printf("\n"); printf("cpot:"); for (i = 1; i <= ta.cols; i++) { printf("%d,",cpot[i]); } printf("\n"); for (i =1; i <=tb.nums; i++) { printf("%d,%d,%d\n", tb.data[i].r, tb.data[i].c, tb.data[i].d); } return 0; }
相关文章推荐
- 矩阵的快速转置
- 数据结构--数组和广义表--以三元组顺序表存储方式的矩阵的一般转置和快速转置
- 实验五:稀疏矩阵的存储和快速转置
- 三元组创建矩阵 一次定位快速转置 矩阵的加法、减法、乘法
- 数据结构学习记录-矩阵的快速转置
- 稀疏矩阵的压缩存储及快速转置
- 稀疏矩阵的快速转置
- 数据结构----稀疏矩阵的快速转置
- 快速转置矩阵
- 矩阵转置的快速转置
- 【LB】稀疏矩阵的快速转置原理及其算法
- 数据结构 矩阵的快速转置 矩阵相乘(行逻辑连接顺序表)
- 稀疏矩阵的列序递增法和一次定位快速转置法
- 矩阵直接转置和快速转置的小例子,VC++6.0通过
- SDUT 3347 矩阵的快速转置
- 稀疏矩阵的转置和快速转置
- 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)
- C++实现稀疏矩阵的压缩存储、转置、快速转置
- 稀疏矩阵的相关操作(存储、转置、快速转置、相加)
- 稀疏矩阵的快速转置