#include<iostream>
using namespace std;
#define maxSize 30
#define ROW 5
#define COL 5
typedef int DataType;
typedef struct {
int row, col;
DataType data;
}Triple;
typedef struct {
int rows, cols, terms=0;
Triple elem[maxSize];
}SparseMatrix;
SparseMatrix*GetSparseMatrix(DataType T[ROW][COL])
{
SparseMatrix*S = new SparseMatrix;
S->cols = COL;
S->rows = ROW;
for(int i=0;i<ROW;i++)
for (int j = 0;j < COL;j++)
{
if (T[i][j] != 0)
{
S->elem[S->terms].data = T[i][j];
S->elem[S->terms].row = i;
S->elem[S->terms].col = j;
S->terms++;
}
}
return S;
}
void Print(SparseMatrix*S)
{
for (int i = 0;i < S->terms;i++)
cout << "row:" << S->elem[i].row << " col:" << S->elem[i].col << " data:" << S->elem[i].data << endl;
}
SparseMatrix*Transpose(SparseMatrix*S)
{
SparseMatrix*ST = new SparseMatrix;
ST->terms =0;
ST->cols = S->rows;
S->rows = S->cols;
for(int i=0;i<S->cols;i++)
for (int j = 0;j < S->terms;j++)
{
if (S->elem[j].col == i)
{
ST->elem[ST->terms].row = S->elem[j].col;
ST->elem[ST->terms].col = S->elem[j].row;
ST->elem[ST->terms].data = S->elem[j].data;
ST->terms++;
}
}
return ST;
}
SparseMatrix*FastTranspose(SparseMatrix*S)
{
int*rowSize = new int[S->cols];
int*rowStart = new int[S->cols];
SparseMatrix*ST = new SparseMatrix;
ST->cols = S->rows;
ST->rows = S->cols;
ST->terms = S->terms;
for (int i = 0;i < S->cols;i++)
rowSize[i] = 0;
for (int i = 0;i < S->terms;i++)
rowSize[S->elem[i].col]++;
rowStart[0] = 0;
for (int i = 1;i < S->cols;i++)
rowStart[i] =rowStart[i-1]+rowSize[i-1];
for (int i = 0;i < S->terms;i++)
{
ST->elem[rowStart[S->elem[i].col]].col = S->elem[i].row;
ST->elem[rowStart[S->elem[i].col]].row = S->elem[i].col;
ST->elem[rowStart[S->elem[i].col]].data = S->elem[i].data;
rowStart[S->elem[i].col]++;
}
return ST;
}
int main()
{
DataType M[ROW][COL];
int k;
for (int i = 0;i < ROW;i++)
for (int j = 0;j < COL;j++)
if ((k = rand() % 10 )> 6)
M[i][j] = k;
else
M[i][j] = 0;
SparseMatrix*SM=GetSparseMatrix(M);
SparseMatrix*ST = Transpose(SM);
SparseMatrix*FST = FastTranspose(SM);
Print(SM);
cout << "转置后:" << endl;
Print(ST);
cout << "快速转置后:" << endl;
Print(FST);
system("pause");
}
C++获取稀疏矩阵以及稀疏矩阵的两种转置方法
最新推荐文章于 2023-10-21 19:48:31 发布