/***************ADT稀疏矩阵*******************
**************BY:loseryao*********************
***************2015-6-11*********************/
#include <iostream>
#define MAX_TREMS 101 //定义矩阵最大值
#define MAX_COL 50//定义最大列值
using namespace std;
/***************定义矩阵*******************************/
typedef struct
{
int row;
int col;
int value;
} term;
term a[MAX_TREMS];
/*********矩阵转置***********************************/
void transpose(term a[] , term b[])
{
int n,i,j ,currentb = 1;
n = a[0].value; //元素总数
b[0].row = a[0].col;
b[0].col = a[0].row;
b[0].value = n;
if(n > 0)
{
for(i = 0; i <a[0].col ;i++)//从a的列转置
{
for(j = 1;j <=n; j++)//扫描a的每一项
{
if(a[j].col == i)
{
b[currentb].col = a[j].row;
b[currentb].row = a[j].col;
b[currentb].value = a[j].value;
currentb++;
}
}
}
}
}
/************************输出矩阵**************************************/
void printMaxtrix(term a[])
{
for(int i = 0; i < a[0].value;i++)
{
cout<<"col = "<<a[i].col<<" row = "<<a[i].row<<" value = "<<a[i].value<<endl;
}
}
/*********************矩阵快速转置************************************/
void fast_transpose(term a[],term b[])
{
int row_item[MAX_COL],start_position[MAX_COL],j=0;
b[0].col = a[0].row;
b[0].row = a[0].col;
b[0].value = a[0].value;
for(int i = 0;i < a[0].col ; i++)
row_item[i] = 0;
for(int i = 1; i <=a[0].value;i++)
row_item[a[i].col]++;
start_position[0] = 1;
for(int i = 1;i < a[0].col;i++)
start_position[i] = start_position[i-1] + row_item[i -1];//当前行的位置是上一行位置加该行个数
for(int i = 1;i <= a[0].value;i++)
{
j = start_position[ a[i].col]++;//如果是重复列可以前进一位
b[j].row = a[i].col;
b[j].col = a[i].row;
b[j].value = a[i].value;
}
}
int main()
{
term a[9],b[9],c[9];
a[0].row = 6;
a[0].col = 6;
a[0].value = 8;
a[1].col = 0;
a[1].row = 0;
a[1].value =15;
a[2].row =0;
a[2].col = 3;
a[2].value =22;
a[3].row = 0;
a[3].col = 5;
a[3].value = -15;
a[4].row = 1;
a[4].col = 1;
a[4].value = 3;
a[5].row = 1;
a[5].col = 2;
a[5].value = 3;
a[6].row = 2;
a[6].col = 3;
a[6].value = -6;
a[7].row = 4;
a[7].col = 0;
a[7].value = 91;
a[8].row= 5;
a[8].col = 2;
a[8].value = 28;
cout<<"Before transpose"<<endl;
printMaxtrix(a);
//transpose(a,b);
//cout<<"After transpose"<<endl;
//printMaxtrix(b);
cout<<"After transpose"<<endl;
fast_transpose(a,c);
printMaxtrix(c);
return 0;
}
ADT稀疏矩阵的两种转置方式
最新推荐文章于 2020-11-05 00:10:58 发布