稀疏矩阵的初始化及其转置(源代码+截图)

  1. 稀疏矩阵:如果在矩阵中,多数的元素为0,通常认为非零元素比上矩阵所有元素的值小于等于0.05时,则称此矩阵为稀疏矩阵(sparse matrix)。
  2. 你可能会想到用二维数组来存放此矩阵中的元素,就像这样:int text[][5] = {{0,5,6,0,4},{0,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0},{0,2,0,0,1}};
  3. 这样好像也没有什么不好。我们再来看看这个矩阵,五行五列,可以包含二十五个元素,但是此矩阵只有七个元素。
  4. 但是我们在存放数据的时候分配了二十五块int单元。这样是不是有点太浪费了。如果我们只存储这七个元素我想会节省一部分内存空间。
  5. 但是如果我们只存储矩阵中的元素还是不行的,因为只有元素我们就无法还原矩阵,我们还需要此元素的行列值。
  • 这样就好办了。我们声明一个结构体来表示一个元素。

 typedef struct matrix
 {
     int row;        //行
     int col;        //列
     int value;        //元素值
 }; 

  • 定义两个数组,一个用来存储稀疏矩阵,一个用来存储转置过后的矩阵:

struct matrix a[MAX_TERM];        //存放矩阵中元素数值不为零的元素
struct matrix b[MAX_TERM];        //转置后的矩阵

  • 存储稀疏矩阵,并赋值:

int initialize(struct matrix a[MAX_TERM])            //初始化稀疏矩阵
 {
     int i,j;
     int count_a = 1;
     for(i = 0;i < N;i++)
     {
         for(j = 0;j < N;j++)
         {
             if(text[i][j] != 0)
             {
                 a[count_a].row = i;
                 a[count_a].col = j;
                 a[count_a].value = text[i][j];
                 count_a++;
             }
         }
     }
     a[0].col = 5;            //矩阵的总列数
     a[0].row = 5;            //矩阵的总行数
     a[0].value = --count_a;    //矩阵中的元素个数
 
     return count_a;
 }


  • 打印原矩阵:

void showmatrix_1(struct matrix a[MAX_TERM],int count_a)        //打印未经压缩的矩阵
 {
     int i,j;
     int text = 1;
     for(i = 0;i < N;i++)
     {
         for(j = 0;j < N;j++)
         {
             if(a[text].row == i && a[text].col == j)
             {
                 printf(" %d ",a[text].value);
                 text++;
             }
             else
                 printf(" 0 ");
         }
         printf("\n");
     }
 
 }


  • 打印压缩过后的矩阵:

 void showmatrix_2(struct matrix a[MAX_TERM],int count_a)            //显示稀疏矩阵方
 {
     int i;
     printf(" i row col val\n");
     for(i = 0;i < count_a + 1;i++)
     {
         printf(" %d|  %d   %d   %d\n",i,a[i].row,a[i].col,a[i].value);
     }
 }
 


  • 转置矩阵并打印:

 void reversal(struct matrix a[MAX_TERM],struct matrix b[MAX_TERM])            //转置矩阵并打印
 {
     int i,j;
     int count_b = 1;        //b的当前元素下标
     b[0].row = a[0].col;
     b[0].col = a[0].row;
     b[0].value = a[0].value;
     for(i = 0;i < a[0].col;i++)
     {
         for(j = 1;j <= a[0].value;j++)
         {
             if(a[j].col == i)
             {
                 b[count_b].row = a[j].col;
                 b[count_b].col = a[j].row;
                 b[count_b].value = a[j].value;
                 count_b++;
             }
         }
     }
     
      for(i = 0;i < a[0].value + 1;i++)
         printf(" %d|  %d   %d   %d\n",i,b[i].row,b[i].col,b[i].value);
 }
  • 完整的源程序如下:

#include<stdio.h>
#define N 5
#define MAX_TERM 15
 
typedef struct matrix
{
     int row;        //行
     int col;        //列
     int value;        //元素值
};
 
int text[5][5] = {{0,5,6,0,4},{0,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0},{0,2,0,0,1}};	//用二维数组存储矩阵的初始值 
struct matrix a[MAX_TERM];        //存放矩阵中元素数值不为零的元素
struct matrix b[MAX_TERM];        //转置后的矩阵

int initialize(struct matrix a[MAX_TERM])            //初始化稀疏矩阵
{
    int i,j;
    int count_a = 1;
    for(i = 0;i < N;i++)
    {
        for(j = 0;j < N;j++)
        {
            if(text[i][j] != 0)
            {
                a[count_a].row = i;
                a[count_a].col = j;
                a[count_a].value = text[i][j];
                count_a++;
            }
        }
    }
    a[0].col = 5;            //矩阵的总列数
    a[0].row = 5;            //矩阵的总行数
    a[0].value = --count_a;    //矩阵中的元素个数

    return count_a;
}

void showmatrix_1(struct matrix a[MAX_TERM],int count_a)        //打印稀疏矩阵
{
    int i,j;
    int text = 1;
    for(i = 0;i < N;i++)
    {
        for(j = 0;j < N;j++)
        {
            if(a[text].row == i && a[text].col == j)
            {
                printf(" %d ",a[text].value);
                text++;
            }
            else
                printf(" 0 ");
        }
        printf("\n");
    }

}

void showmatrix_2(struct matrix a[MAX_TERM],int count_a)            //显示稀疏矩阵方
{
    int i;
    printf(" i row col val\n");
    for(i = 0;i < count_a + 1;i++)
    {
        printf(" %d|  %d   %d   %d\n",i,a[i].row,a[i].col,a[i].value);
    }
}


void reversal(struct matrix a[MAX_TERM],struct matrix b[MAX_TERM])            //转置矩阵方法一
{
    int i,j;
    int count_b = 1;        //b的当前元素下标
    b[0].row = a[0].col;
    b[0].col = a[0].row;
    b[0].value = a[0].value;
    for(i = 0;i < a[0].col;i++)
    {
        for(j = 1;j <= a[0].value;j++)
        {
            if(a[j].col == i)
            {
                b[count_b].row = a[j].col;
                b[count_b].col = a[j].row;
                b[count_b].value = a[j].value;
                count_b++;
            }
        }
    }
    
     for(i = 0;i < a[0].value + 1;i++)
        printf(" %d|  %d   %d   %d\n",i,b[i].row,b[i].col,b[i].value);
}

int main(void)
{
    int count_a;	//记录非0元素的个数 
    count_a = initialize(a);	//初始化矩阵 ,并统计非0的元素个数 
    
    printf("打印原矩阵\n");
    showmatrix_1(a,count_a);	//显示原矩阵 
    
    
    printf("\n显示压缩矩阵\n");
    showmatrix_2(a,count_a);	//显示压缩矩阵 
    
    putchar('\n');
    
    printf("转置过后的矩阵\n") ;
    reversal(a,b);
    
    
    printf("\n");
    
    return 0;
}

  • devc++中的运行截图:




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值