回 帖 发 新 帖 刷新版面

主题:交流

#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个回复)

沙发

#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);
}







    



    
    

板凳

//矩阵转化为数组
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 楼

//矩阵减法
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 楼

以上通过测试,就是矩阵乘法难写了一点
这是我的一个同学写的

5 楼

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 楼

测试函数(我写的)比较差

7 楼

//矩阵加法
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 楼

矩阵乘法

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;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册