主题:交流
lt19870917
[专家分:750] 发布于 2006-04-22 16:15:00
#ifndef _matrix_h
#define _matrix_h
#include "stdlib.h"
#include "stdio.h"
typedef int elemtype;
typedef struct tsmatrix *matrix;
#define RANK 8
#define COL 8
/////////////////////////////////////////////////////////////////////////////////////////////////
//创建一个稀疏矩阵
matrix CreatMatrix();
/////////////////////////////////////////////////////////////////////////////////////////////////
//初始条件:数组array存在
//操作结果:将数组array转化为稀疏矩阵M
void ArrayToMatrix(elemtype array[][COL],matrix M);
/////////////////////////////////////////////////////////////////////////////////////////////////
//初始条件:稀疏矩阵M存在
//销毁稀疏矩阵M
void DestroyMatrix(matrix M);
/////////////////////////////////////////////////////////////////////////////////////////////////
//初始条件:稀疏矩阵M存在
//操作结果:由稀疏矩阵M复制得到T
void CopyMatrix(matrix M,matrix T);
/////////////////////////////////////////////////////////////////////////////////////////////////
//初始条件:稀疏矩阵M存在
//操作结果:输出稀疏矩阵M
void PrintMatrix(matrix M);
/////////////////////////////////////////////////////////////////////////////////////////////////
//初始条件:稀疏矩阵M存在
//操作结果:将稀疏矩阵M转化为数组array
void MatrixToArray(matrix M,elemtype array[][COL]);
/////////////////////////////////////////////////////////////////////////////////////////////////
//初始条件:稀疏矩阵M和M的行数和列数对应相等
//操作结果:求悉数矩阵的和Q=M+N
void AddMatrix(matrix M,matrix N,matrix Q);
/////////////////////////////////////////////////////////////////////////////////////////////////
//初始条件:稀疏矩阵M和M的行数和列数对应相等
//操作结果:求悉数矩阵的差Q=M-N
void SubMatrix(matrix M,matrix N,matrix Q);
////////////////////////////////////////////////////////////////////////////////////////////////
//初始条件:稀疏矩阵M存在
//操作结果:求稀疏矩阵M的转置矩阵T
void TransposeMatrix(matrix M,matrix T);
回复列表 (共8个回复)
沙发
lt19870917 [专家分:750] 发布于 2006-04-22 16:17:00
#include "matrix.h"
#define MAXSIZE 10000
#define ZERO 0
struct triple
{
int i,j;//代表行和列(从第0行第0列开始)
elemtype e;
};
struct tsmatrix
{
triple data[MAXSIZE];//使用data[o]
int mu,nu,tu;
};
//建立矩阵,并进行初始化
matrix CreatMatrix()//定义稀疏矩阵之后,必须做的第一步(分配空间)
{
matrix p;
p=(tsmatrix *)malloc(sizeof(tsmatrix));
if(!p) exit(1);
p->mu=0;
p->nu=0;
p->tu=0;
return(p);
}
//数组转化为矩阵
void ArrayToMatrix(elemtype array[][COL],matrix M)
{
int i,j,k=0;
for(i=0;i<RANK;i++){
for(j=0;j<COL;j++){
if(array[i][j]!=0){
M->data[k].i=i;
M->data[k].j=j;
M->data[k].e=array[i][j];
k++;
if(i>M->mu) M->mu=i+1;
if(j>M->nu) M->nu=j+1;
}
}
}
M->tu=k;
}
//销毁矩阵
void DestroyMatrix(matrix M)
{
if(M->data!=NULL) free(M->data);
free(M);
}
//复制矩阵
void CopyMatrix(matrix M,matrix T)
{
int i;
for(i=0;i<M->tu;i++)
T->data[i]=M->data[i];
T->mu=M->mu;
T->nu=M->nu;
T->tu=M->tu;
}
//打印矩阵(两种方式)
void PrintMatrix(matrix M)
{
int i,j,k=0;
for(i=0;i<RANK;i++){
for(j=0;j<COL;j++){
if(i=M->data[k].mu&&j=M->data[k].nu) printf("%d ",M->data[k].e);
else printf("ZERO");
}
printf("\n");
}
printf("Rank\tCol\tValue\n");
for(int count=0;count<M->tu;count++)
printf("%d\t%d\t%d\n",M->data[count].mu,M->data[count].nu,M->data[count].e);
}
板凳
lt19870917 [专家分:750] 发布于 2006-04-22 16:18:00
//矩阵转化为数组
void MatrixToArray(matrix M,elemtype array[][COL])
{
int i,j,k=0;
for(i=0;i<RANK;i++){
for(j=0;j<COL;j++){
if(i=M->data[k].mu&&j=M->data[k].nu) array[i][j]=M->data[k].e;
else array[i][j]=0;
}
}
}
//矩阵加法
void AddMatrix(matrix M,matrix N,matrix Q)
{
int i,j=0,k=0;
for(i=0;i<N->tu;i++){
for(;j<M->tu;){
if(N->data[i].i==M->data[j].i){
if(N->data[i].j==M->data[j].j){
Q->data[k].i=N->data[i].i;
Q->data[k].j=N->data[i].j;
Q->data[k].e=N->data[i].e+M->data[j].e;
k++;
j++;
break;
}
else if(M->data[j].j<N->data[i].j){
Q->data[k].i=M->data[j].i;
Q->data[k].j=M->data[j].j;
Q->data[k].e=M->data[j].e;
k++;
j++;
}
else{
Q->data[k].i=N->data[i].i;
Q->data[k].j=N->data[i].j;
Q->data[k].e=N->data[i].e;
k++;
break;
}
}
else if(M->data[j].i>N->data[i].i){
Q->data[k].i=N->data[i].i;
Q->data[k].j=N->data[i].j;
Q->data[k].e=N->data[i].e;
k++;
break;
}
else{
Q->data[k].i=M->data[j].i;
Q->data[k].j=M->data[j].j;
Q->data[k].e=M->data[j].e;
k++;
j++;
}
}
}
Q->tu=k;
if(N->data[(N->tu)-1].i>M->data[(M->tu)-1].i) Q->mu=N->data[(N->tu)-1].i;
else Q->mu=M->data[(M->tu)-1].i;
if(N->data[(N->tu)-1].j>M->data[(M->tu)-1].j) Q->nu=N->data[(N->tu)-1].j;
else Q->nu=M->data[(M->tu)-1].j;
}
3 楼
lt19870917 [专家分:750] 发布于 2006-04-22 16:18:00
//矩阵减法
void SubMatrix(matrix M,matrix N,matrix Q)
{
int i,j=0,k=0;
for(i=0;i<N->tu;i++){
for(;j<M->tu;){
if(N->data[i].i==M->data[j].i){
if(N->data[i].j==M->data[j].j){
Q->data[k].i=N->data[i].i;
Q->data[k].j=N->data[i].j;
Q->data[k].e=N->data[i].e-M->data[j].e;
k++;
j++;
break;
}
else if(M->data[j].j<N->data[i].j){
Q->data[k].i=M->data[j].i;
Q->data[k].j=M->data[j].j;
Q->data[k].e=-(M->data[j].e);
k++;
j++;
}
else{
Q->data[k].i=N->data[i].i;
Q->data[k].j=N->data[i].j;
Q->data[k].e=N->data[i].e;
k++;
break;
}
}
else if(M->data[j].i>N->data[i].i){
Q->data[k].i=N->data[i].i;
Q->data[k].j=N->data[i].j;
Q->data[k].e=N->data[i].e;
k++;
break;
}
else{
Q->data[k].i=M->data[j].i;
Q->data[k].j=M->data[j].j;
Q->data[k].e=-(M->data[j].e);
k++;
j++;
}
}
}
Q->tu=k;
if(N->data[(N->tu)-1].i>M->data[(M->tu)-1].i) Q->mu=N->data[(N->tu)-1].i;
else Q->mu=M->data[(M->tu)-1].i;
if(N->data[(N->tu)-1].j>M->data[(M->tu)-1].j) Q->nu=N->data[(N->tu)-1].j;
else Q->nu=M->data[(M->tu)-1].j;
}
//矩阵转置
void TransposeMatrix(matrix M,matrix T)
{
int col,i,k=0;
for(col=0;col<M->nu;col++){
for(i=0;i<M->tu;i++){
if(M->data[i].j==col){
T->data[k].i=col;
T->data[k].j=M->data[i].i;
T->data[k].e=M->data[i].e;
k++;
}
}
}
T->nu=M->mu;
T->mu=M->nu;
T->tu=M->tu;
}
4 楼
lt19870917 [专家分:750] 发布于 2006-04-22 16:19:00
以上通过测试,就是矩阵乘法难写了一点
这是我的一个同学写的
5 楼
lt19870917 [专家分:750] 发布于 2006-04-22 16:20:00
void main()
{
int a[RANK][COL],b[RANK][COL],c[RANK][COL];
matrix s,t,q,sum,sub,zh;
int i,j;
for(i=0;i<RANK;i++){
for(j=0;j<COL;j++)
a[i][j]=0;
}
a[0][2]=5;
a[0][3]=4;
a[0][4]=3;
a[1][3]=2;
a[1][6]=1;
a[2][0]=3;
a[2][4]=1;
a[3][1]=5;
a[4][0]=7;
a[4][3]=4;
a[4][6]=2;
a[5][2]=2;
a[5][4]=5;
a[5][6]=9;
a[7][1]=2;
a[7][5]=2;
s=CreatMatrix();
t=CreatMatrix();
q=CreatMatrix();
sum=CreatMatrix();
sub=CreatMatrix();
zh=CreatMatrix();
ArrayToMatrix(a,s);
PrintMatrix(s);
CopyMatrix(s,t);
MatrixToArray(t,b);
for(i=0;i<RANK;i++){
for(j=0;j<COL;j++)
printf("%d ",b[i][j]);
printf("\n");
}
for(i=0;i<RANK;i++){
for(j=0;j<COL;j++)
c[i][j]=0;
}
c[0][0]=1;
c[0][3]=7;
c[0][7]=2;
c[1][3]=2;
c[1][5]=1;
c[2][0]=4;
c[2][2]=1;
c[4][0]=1;
c[5][3]=4;
c[5][4]=2;
c[6][2]=1;
c[6][3]=5;
c[6][4]=7;
c[7][4]=1;
c[7][7]=1;
ArrayToMatrix(c,q);
PrintMatrix(q);
AddMatrix(s,q,sum);
PrintMatrix(sum);
SubMatrix(s,q,sub);
PrintMatrix(sub);
TransposeMatrix(s,zh);
PrintMatrix(zh);
}
6 楼
lt19870917 [专家分:750] 发布于 2006-04-22 16:23:00
测试函数(我写的)比较差
7 楼
flysun0311 [专家分:2040] 发布于 2006-04-23 14:22:00
//矩阵加法
void AddMatrix(matrix M,matrix N,matrix Q)
{
int i,j=0,k=0;
for(i=0;i<N->tu;i++){ //这里两重循环没必要.可以改为:
for(;j<M->tu;){ //while(i<N->tu&&j<M->tu)就可以了!
//矩阵转置
void TransposeMatrix(matrix M,matrix T)
{
int col,i,k=0;
for(col=0;col<M->nu;col++){
for(i=0;i<M->tu;i++){
if(M->data[i].j==col){
T->data[k].i=col;
T->data[k].j=M->data[i].i;
T->data[k].e=M->data[i].e;
k++;
}
}
}
T->nu=M->mu;
T->mu=M->nu;
T->tu=M->tu;
}
这个转置是最基本的一个效率底,你可以弄个快速转置.
8 楼
lt19870917 [专家分:750] 发布于 2006-04-25 22:55:00
矩阵乘法
void MultiMatrix(matrix M,matrix N,matrix Q)
{
int i=0,k=0,j,m,rank=0,temp[COL],maxcol,max=0;
for(;rank<RANK;rank++){
for(m=0;m<COL;m++)
temp[m]=0;
for(;i<M->tu;i++){
if(M->data[i].i!=rank) break;
else{
for(j=0;j<N->tu;j++){
if(M->data[i].j==N->data[j].i) temp[N->data[j].j]+=(M->data[i].e)*(N->data[j].e);
}
}
}
for(m=0;m<COL;m++){
if(temp[m]!=0){
Q->data[k].i=rank;
Q->data[k].j=m;
Q->data[k++].e=temp[m];
maxcol=m;
}
}
if(maxcol>max) max=maxcol;
}
Q->tu=k;
Q->mu=Q->data[k-1].i;
Q->nu=max;
}
我来回复