稀疏矩阵的存储与快速转置
2013-09-12 19:28
423 查看
点击(此处)折叠或打开
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int row;
int col;
int e;
}Triplet;
typedef struct {
Triplet data[10];
int rows;
int cols;
int nums;
}Table;
void Create (Table *t,int *Matrix,int m,int n)
{
int i,j;
/*
for (i=0;i<3;i++)
{
for (j=0;j<4;j++)
printf ("%d ",*(Matrix+i*n+j));
printf ("\n");
}
getch ();
*/
t->rows=m;
t->cols=n;
t->nums=0;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
if (*(Matrix+i*n+j)!=0)
{
t->nums++;
t->data[t->nums].row=i+1;
t->data[t->nums].col=j+1;
t->data[t->nums].e=*(Matrix+i*n+j);
}
}
void Trans (Table M,Table *T)
{
int col,t,p,q;
int num[10];
int cpot[10];
T->rows=M.cols;
T->cols=M.rows;
T->nums=M.nums;
if (T->nums)
{
for (col=1;col<=M.cols;++col)
num[col]=0;
for (t=1;t<=M.nums;++t)
++num[M.data[t].col];
cpot[1]=1;
for (col=2;col<=M.cols;++col)
cpot[col]=cpot[col-1]+num[col-1];
for (p=1;p<=M.nums;++p)
{
col=M.data[p].col;
q=cpot[col];
T->data[q].row=M.data[p].col;
T->data[q].col=M.data[p].row;
T->data[q].e=M.data[p].e;
++cpot[col];
}
}
}
void ToMatrix(Table t,int *Matrix,int m,int n)
{
int i,j;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
*(Matrix+i*n+j)=0;
for (i=1;i<=t.nums;i++)
{
*(Matrix+(t.data[i].row-1)*n+(t.data[i].col-1))=t.data[i].e;
}
}
int main ()
{
int i,j;
Table A,TA;
int MatrixA[3][4] =
{{3,0,0,5},
{0,-1,0,0},
{0,2,0,0}};
int MatrixB[4][3];
Create (&A,MatrixA,3,4);
Trans (A, &TA);
ToMatrix (TA,MatrixB,4,3);
for (i=0;i<4;i++)
{
for (j=0;j<3;j++)
printf ("%d ",MatrixB[i][j]);
printf ("\n");
}
}
点击(此处)折叠或打开
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int row;
int col;
int e;
}Triplet;
typedef struct {
Triplet data[10];
int rows;
int cols;
int nums;
}Table;
void Create (Table *t,int *Matrix,int m,int n)
{
int i,j;
/*
for (i=0;i<3;i++)
{
for (j=0;j<4;j++)
printf ("%d ",*(Matrix+i*n+j));
printf ("\n");
}
getch ();
*/
t->rows=m;
t->cols=n;
t->nums=0;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
if (*(Matrix+i*n+j)!=0)
{
t->nums++;
t->data[t->nums].row=i+1;
t->data[t->nums].col=j+1;
t->data[t->nums].e=*(Matrix+i*n+j);
}
}
void Trans (Table M,Table *T)
{
int col,t,p,q;
int num[10];
int cpot[10];
T->rows=M.cols;
T->cols=M.rows;
T->nums=M.nums;
if (T->nums)
{
for (col=1;col<=M.cols;++col)
num[col]=0;
for (t=1;t<=M.nums;++t)
++num[M.data[t].col];
cpot[1]=1;
for (col=2;col<=M.cols;++col)
cpot[col]=cpot[col-1]+num[col-1];
for (p=1;p<=M.nums;++p)
{
col=M.data[p].col;
q=cpot[col];
T->data[q].row=M.data[p].col;
T->data[q].col=M.data[p].row;
T->data[q].e=M.data[p].e;
++cpot[col];
}
}
}
void MultSMatrix (Table M,Table N,Table *Q)
{
int arow,brow,tp,p,q,t,ccol,row,i;
int ctemp[10];
int rpos[10];
int num[10];
int Mrpos[10];
int Nrpos[10];
if (M.cols!=N.rows)
exit (1);
Q->rows=M.rows;
Q->cols=N.cols;
Q->nums=0;
for (row=1;row<=M.rows;++row)
num[row]=0;
for (t=1;t<=M.nums;++t)
++num[M.data[t].row];
Mrpos[1]=1;
for (row=2;row<=M.rows;++row)
Mrpos[row]=Mrpos[row-1]+num[row-1];
for (row=1;row<=N.rows;++row)
num[row]=0;
for (t=1;t<=N.nums;++t)
++num[N.data[t].row];
Nrpos[1]=1;
for (row=2;row<=N.rows;++row)
Nrpos[row]=Nrpos[row-1]+num[row-1];
if (M.nums*N.nums!=0)
{
for (arow=1;arow<=M.rows;++arow)
{
for (i=0;i<10;i++)
ctemp[i]=0;
rpos[arow]=Q->nums+1;
if (arow<M.rows)
tp=Mrpos[arow+1];
else
tp=M.nums+1;
for (p=Mrpos[arow];p<tp;++p)
{
brow=M.data[p].col;
if (brow<N.rows)
t=Nrpos[brow+1];
else
t=N.nums+1;
for (q=Nrpos[brow];q<t;++q)
{
ccol=N.data[q].col;
ctemp[ccol]=ctemp[ccol]+M.data[p].e*N.data[q].e;
}
}
for (ccol=1;ccol<=Q->cols;++ccol)
if (ctemp[ccol])
{
Q->nums++;
Q->data[Q->nums].row=arow;
Q->data[Q->nums].col=ccol;
Q->data[Q->nums].e=ctemp[ccol];
}
}
}
}
void ToMatrix(Table t,int *Matrix,int m,int n)
{
int i,j;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
*(Matrix+i*n+j)=0;
for (i=1;i<=t.nums;i++)
{
*(Matrix+(t.data[i].row-1)*n+(t.data[i].col-1))=t.data[i].e;
}
}
int main ()
{
int i,j;
Table A,B,AB;
int MatrixA[3][2] =
{{2,3},
{0,4},
{1,2}};
int MatrixB[2][3] =
{{2,5,1},
{0,2,4}};
int MatrixAB[3][3];
Create (&A,MatrixA,3,2);
Create (&B,MatrixB,2,3);
MultSMatrix (A,B,&AB);
ToMatrix (AB,MatrixAB,3,3);
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
printf ("%d ",MatrixAB[i][j]);
printf ("\n");
}
getchar ();
}
阅读(671) | 评论(0) | 转发(1) |
0
上一篇:迷宫问题
下一篇:二叉树
相关热门文章
建筑工程管理软件信息管理的目...
块设备驱动程序设计
!优惠HP8561E HP8563E频谱分析...
!中秋热卖AgilentE4421B信号源...
ipcam的几个概念
test123
编写安全代码——小心有符号数...
使用openssl api进行加密解密...
一段自己打印自己的c程序...
sql relay的c++接口
怎么样找出BIND中查询并发量多...
可有人在实际的openstack生产...
如下makefile如何编写
sqlldr 参数配置
讨论一下各位所管理的mysql生...
给主人留下些什么吧!~~
评论热议
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int row;
int col;
int e;
}Triplet;
typedef struct {
Triplet data[10];
int rows;
int cols;
int nums;
}Table;
void Create (Table *t,int *Matrix,int m,int n)
{
int i,j;
/*
for (i=0;i<3;i++)
{
for (j=0;j<4;j++)
printf ("%d ",*(Matrix+i*n+j));
printf ("\n");
}
getch ();
*/
t->rows=m;
t->cols=n;
t->nums=0;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
if (*(Matrix+i*n+j)!=0)
{
t->nums++;
t->data[t->nums].row=i+1;
t->data[t->nums].col=j+1;
t->data[t->nums].e=*(Matrix+i*n+j);
}
}
void Trans (Table M,Table *T)
{
int col,t,p,q;
int num[10];
int cpot[10];
T->rows=M.cols;
T->cols=M.rows;
T->nums=M.nums;
if (T->nums)
{
for (col=1;col<=M.cols;++col)
num[col]=0;
for (t=1;t<=M.nums;++t)
++num[M.data[t].col];
cpot[1]=1;
for (col=2;col<=M.cols;++col)
cpot[col]=cpot[col-1]+num[col-1];
for (p=1;p<=M.nums;++p)
{
col=M.data[p].col;
q=cpot[col];
T->data[q].row=M.data[p].col;
T->data[q].col=M.data[p].row;
T->data[q].e=M.data[p].e;
++cpot[col];
}
}
}
void ToMatrix(Table t,int *Matrix,int m,int n)
{
int i,j;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
*(Matrix+i*n+j)=0;
for (i=1;i<=t.nums;i++)
{
*(Matrix+(t.data[i].row-1)*n+(t.data[i].col-1))=t.data[i].e;
}
}
int main ()
{
int i,j;
Table A,TA;
int MatrixA[3][4] =
{{3,0,0,5},
{0,-1,0,0},
{0,2,0,0}};
int MatrixB[4][3];
Create (&A,MatrixA,3,4);
Trans (A, &TA);
ToMatrix (TA,MatrixB,4,3);
for (i=0;i<4;i++)
{
for (j=0;j<3;j++)
printf ("%d ",MatrixB[i][j]);
printf ("\n");
}
}
点击(此处)折叠或打开
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int row;
int col;
int e;
}Triplet;
typedef struct {
Triplet data[10];
int rows;
int cols;
int nums;
}Table;
void Create (Table *t,int *Matrix,int m,int n)
{
int i,j;
/*
for (i=0;i<3;i++)
{
for (j=0;j<4;j++)
printf ("%d ",*(Matrix+i*n+j));
printf ("\n");
}
getch ();
*/
t->rows=m;
t->cols=n;
t->nums=0;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
if (*(Matrix+i*n+j)!=0)
{
t->nums++;
t->data[t->nums].row=i+1;
t->data[t->nums].col=j+1;
t->data[t->nums].e=*(Matrix+i*n+j);
}
}
void Trans (Table M,Table *T)
{
int col,t,p,q;
int num[10];
int cpot[10];
T->rows=M.cols;
T->cols=M.rows;
T->nums=M.nums;
if (T->nums)
{
for (col=1;col<=M.cols;++col)
num[col]=0;
for (t=1;t<=M.nums;++t)
++num[M.data[t].col];
cpot[1]=1;
for (col=2;col<=M.cols;++col)
cpot[col]=cpot[col-1]+num[col-1];
for (p=1;p<=M.nums;++p)
{
col=M.data[p].col;
q=cpot[col];
T->data[q].row=M.data[p].col;
T->data[q].col=M.data[p].row;
T->data[q].e=M.data[p].e;
++cpot[col];
}
}
}
void MultSMatrix (Table M,Table N,Table *Q)
{
int arow,brow,tp,p,q,t,ccol,row,i;
int ctemp[10];
int rpos[10];
int num[10];
int Mrpos[10];
int Nrpos[10];
if (M.cols!=N.rows)
exit (1);
Q->rows=M.rows;
Q->cols=N.cols;
Q->nums=0;
for (row=1;row<=M.rows;++row)
num[row]=0;
for (t=1;t<=M.nums;++t)
++num[M.data[t].row];
Mrpos[1]=1;
for (row=2;row<=M.rows;++row)
Mrpos[row]=Mrpos[row-1]+num[row-1];
for (row=1;row<=N.rows;++row)
num[row]=0;
for (t=1;t<=N.nums;++t)
++num[N.data[t].row];
Nrpos[1]=1;
for (row=2;row<=N.rows;++row)
Nrpos[row]=Nrpos[row-1]+num[row-1];
if (M.nums*N.nums!=0)
{
for (arow=1;arow<=M.rows;++arow)
{
for (i=0;i<10;i++)
ctemp[i]=0;
rpos[arow]=Q->nums+1;
if (arow<M.rows)
tp=Mrpos[arow+1];
else
tp=M.nums+1;
for (p=Mrpos[arow];p<tp;++p)
{
brow=M.data[p].col;
if (brow<N.rows)
t=Nrpos[brow+1];
else
t=N.nums+1;
for (q=Nrpos[brow];q<t;++q)
{
ccol=N.data[q].col;
ctemp[ccol]=ctemp[ccol]+M.data[p].e*N.data[q].e;
}
}
for (ccol=1;ccol<=Q->cols;++ccol)
if (ctemp[ccol])
{
Q->nums++;
Q->data[Q->nums].row=arow;
Q->data[Q->nums].col=ccol;
Q->data[Q->nums].e=ctemp[ccol];
}
}
}
}
void ToMatrix(Table t,int *Matrix,int m,int n)
{
int i,j;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
*(Matrix+i*n+j)=0;
for (i=1;i<=t.nums;i++)
{
*(Matrix+(t.data[i].row-1)*n+(t.data[i].col-1))=t.data[i].e;
}
}
int main ()
{
int i,j;
Table A,B,AB;
int MatrixA[3][2] =
{{2,3},
{0,4},
{1,2}};
int MatrixB[2][3] =
{{2,5,1},
{0,2,4}};
int MatrixAB[3][3];
Create (&A,MatrixA,3,2);
Create (&B,MatrixB,2,3);
MultSMatrix (A,B,&AB);
ToMatrix (AB,MatrixAB,3,3);
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
printf ("%d ",MatrixAB[i][j]);
printf ("\n");
}
getchar ();
}
阅读(671) | 评论(0) | 转发(1) |
0
上一篇:迷宫问题
下一篇:二叉树
相关热门文章
建筑工程管理软件信息管理的目...
块设备驱动程序设计
!优惠HP8561E HP8563E频谱分析...
!中秋热卖AgilentE4421B信号源...
ipcam的几个概念
test123
编写安全代码——小心有符号数...
使用openssl api进行加密解密...
一段自己打印自己的c程序...
sql relay的c++接口
怎么样找出BIND中查询并发量多...
可有人在实际的openstack生产...
如下makefile如何编写
sqlldr 参数配置
讨论一下各位所管理的mysql生...
给主人留下些什么吧!~~
评论热议
相关文章推荐
- 稀疏矩阵的存储方式及其快速转置的实现
- 实验五:稀疏矩阵的存储和快速转置
- 稀疏矩阵的存储和快速转置
- C++实现稀疏矩阵的压缩存储、转置、快速转置
- 稀疏矩阵的压缩存储与快速转置 三元组法 类与对象实现
- sdut 1592转置矩阵【稀疏矩阵的压缩存储】【快速转置算法】
- 【数据结构】稀疏结构及稀疏矩阵的压缩存储,矩阵的(快速)转置
- 第五次实验 稀疏矩阵的存储和快速转置
- 【数据结构】稀疏结构及稀疏矩阵的压缩存储,矩阵的(快速)转置
- 稀疏矩阵的压缩存储及转置,快速转置法,C++代码实现
- 稀疏矩阵-压缩存储-列转置法- 一次定位快速转置法
- 稀疏矩阵的压缩存储及快速转置
- 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)
- 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)
- 稀疏矩阵-压缩存储-列转置法- 一次定位快速转置法
- 稀疏矩阵的压缩存储以及快速转置
- 5.3矩阵的压缩存储(稀疏矩阵转置和快速转置)
- 稀疏矩阵的相关操作(存储、转置、快速转置、相加)
- 【代码】稀疏矩阵的压缩存储与转置算法
- 稀疏矩阵的快速转置