//顺序存储稀疏矩阵三元组表 一般转置法和快速转置法
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 1000
typedef int DataType;
typedef struct {
int i, j;
DataType v;
}TriTupleNode;
typedef struct {
TriTupleNode data[MaxSize];
int m, n, t;
}TSMatrix;
//建立一个顺序存储稀疏矩阵三元组表
void CreateTriTable(TSMatrix *b,int a[][5],int m,int n) {
int k = 0;
int i, j;
for (i = 0; i < m;i++) {
for (j = 0; j < n; j++) {
if (a[i][j]!=0) {
b->data[k].i = i;
b->data[k].j = j;
b->data[k].v = a[i][j];
k++;
}
}
}
b->m = m;
b->n = n;
b->t = k;
}
//一般转置算法
void TransMatirx(TSMatrix* a, TSMatrix* b) {
int p,col,q=0;
b->m = a->n;
b->n = a->m;
b->t = a->t;
if (b->t<0) {
printf("M中无非零元素");
}else {
for (col = 0; col < a->n;col++) {
for (p = 0; p < a->t;p++) {
if (col == a->data[p].j) {
b->data[q].i = a->data[p].j;
b->data[q].j = a->data[p].i;
b->data[q].v = a->data[p].v;
q++;
}
}
}
}
}
//快速转置法
void FastTran(TSMatrix* a, TSMatrix* b) {
int col,t,p,q;
int* num, * rownext;
num = (int *)calloc(a->n + 1, 4);
rownext = (int *)calloc(a->m + 1, 4);
b->m = a->n;
b->n = a->m;
b->t = a->t;
if (b->t) {
for (col = 0; col < a->n;col++) {
num[col] = 0;
}
for (t = 0; t < a->t; t++) {
++num[a->data[t].j];
}
rownext[0] = 0;
for (col = 1; col < a->n; col++) {
rownext[col] = rownext[col-1]+ num[col-1];
}
for (p = 0; p < a->t;p++) {
col = a->data[p].j;
q = rownext[col];
b->data[q].i = a->data[p].j;
b->data[q].j = a->data[p].i;
b->data[q].v = a->data[p].v;
++rownext[col];
}
}
}
int main() {
int a[][5]= { {0,3,0,5,0}, {0,0,-2,0,0}, {1,0,0,0,6}, {0,0,8,0,0}};
TSMatrix *t = new TSMatrix;
CreateTriTable(t, a, 4, 5);
TSMatrix* b = new TSMatrix;
//TransMatirx(t, b);
FastTran(t, b);
}
//JAVA语言
public class TsMatirx { private static final int maxSize = 10000; private TriTupleNode data[] = new TriTupleNode[maxSize]; //行数 private int m = 0; //列数 private int n = 0; //非 零个数 private int t = 0; //建立一个顺序存储稀疏矩阵三元组表 public void createTriTable(TsMatirx b, int a[][], int m, int n) { int k = 0, i, j; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { if (a[i][j] != 0) { TriTupleNode triTupleNode = new TriTupleNode(); triTupleNode.i = i; triTupleNode.j = j; triTupleNode.v = a[i][j]; b.data[k] = triTupleNode; k++; } } } b.m = m; b.n = n; b.t = k; } //一般转置算法 public void transMatirx(TsMatirx a, TsMatirx b) throws Exception { int col, p, q = 0; if (a.t < 1) { throw new Exception("无非零元素"); } else { b.m = a.n; b.n = a.m; b.t = a.t; for (col = 0; col < a.n; col++) { for (p = 0; p < a.t; p++) { if (col == a.data[p].j) { TriTupleNode triTupleNode = new TriTupleNode(); triTupleNode.i = a.data[p].j; triTupleNode.j = a.data[p].i; triTupleNode.v = a.data[p]; b.data[q] = triTupleNode; q++; } } } } } public void fastTran(TsMatirx a, TsMatirx b) throws Exception { int col, t, p, q; if (a.t < 1) { throw new Exception("无非零元素"); } else { b.m = a.n; b.n = a.m; b.t = a.t; int num[] = new int[a.n]; int rownext[] = new int[a.n]; for (col = 0; col < a.n; col++) { num[col] = 0; rownext[col] = 0; } for (t = 0; t < a.t; t++) { num[a.data[t].j] = ++num[a.data[t].j]; } for (col = 1; col < a.n; col++) { rownext[col] = rownext[col - 1] + num[col - 1]; } for (p = 0; p < a.t; p++) { q = rownext[a.data[p].j]; TriTupleNode triTupleNode = new TriTupleNode(); triTupleNode.i = a.data[p].j; triTupleNode.j = a.data[p].i; triTupleNode.v = a.data[p]; b.data[q] = triTupleNode; rownext[a.data[p].j] = ++rownext[a.data[p].j]; } } } private class TriTupleNode { public int i = 0; public int j = 0; public Object v = 0; } public static void main(String[] args) throws Exception { int a[][] = {{0, 3, 0, 5, 0}, {0, 0, -2, 0, 0}, {1, 0, 0, 0, 6}, {0, 0, 8, 0, 0}}; TsMatirx t = new TsMatirx(); t.createTriTable(t,a,4,5); TsMatirx b = new TsMatirx(); b.transMatirx(t, b); TsMatirx c = new TsMatirx(); b.fastTran(t,c); System.out.println(); } }