首页 > 其他分享 >11、稀疏矩阵的压缩存储

11、稀疏矩阵的压缩存储

时间:2024-09-27 09:01:36浏览次数:7  
标签:11 存储 int 矩阵 ++ total data col row

1、稀疏矩阵的压缩存储定义和初始化

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<assert.h>
#include<memory.h>

#define ElemType int
#define MAXSIZE 100

typedef struct Triple{
    int row;//数据所在行 
    int col;//数据所在列 
    ElemType value;//数据 
}Triple;

typedef struct SMatrix{
    Triple data[MAXSIZE];
    int total_row;//总行数 m行 
    int total_col;//总列数  n行
    int not_zero_count;//非零元素个数 
}SMatrix;// Spare Mastrix

void CreateMatrix(SMatrix *M){
    FILE *fp = fopen("C:\\Users\\16326\\Desktop\\ds\\matrix.txt","r");
    if(fp == NULL){
        exit(1);
    }
    fscanf(fp, "%d %d", &M->total_col, &M->total_row);
    //printf("%d %d", M->mu, M->nu);
    int value;
    int k = 0;//记录data数组下标 ,也是非零元素个数 
    int i =0, j = 0;
    for(i = 0;i < M->total_col;i++){//遍历行 
        for(j = 0;j < M->total_row;j++){//遍历列 
            fscanf(fp,"%d",&value);
            if(value != 0){
                M->data[k].value = value;//记录数据 
                M->data[k].row = i;//记录行 
                M->data[k].col = j;//记录列
                k++; //非零元素个数 ++
            }
        }
    }
    M->not_zero_count = k;//记录非零元素个数 
    fclose(fp);//关闭流 
}
/*
matrix.txt
6 7
0 12 9 0 0 0 0
0 0 0 0 0 0 0
-3 0 0 0 0 14 0
0 0 24 0 0 0 0
0 18 0 0 0 0 0
15 0 0 -7 0 0 0
*/

2、稀疏矩阵转置和快速转置方法

//将 M 转置后储存到 T 中 
void transposeMatrix(SMatrix *M,SMatrix *T){
    T->total_row = M->total_col;
    T->total_col = M->total_row;
    T->not_zero_count = M->not_zero_count;
    
    
    int i = 0,k = 0,q = 0;
    //遍历列,从第一列开始转置
    for(i;i < M->total_col;i++){
        //遍历所有非零元素 
        for(k = 0;k < M->not_zero_count;k++){
            if(M->data[k].col == i){
                T->data[q].value = M->data[k].value;
                T->data[q].col = M->data[k].row;
                T->data[q].row = M->data[k].col;
                q++;
            }
        }
    } 
    
}

void FastTransposeMatrix(SMatrix* M,SMatrix* T){
    if(M->not_zero_count == 0)
        return;
    T->total_row = M->total_col;
    T->total_col = M->total_row;
    T->not_zero_count = M->not_zero_count;
     
    //用于记录每一列非零元素的个数 
    int* num = (int*)malloc(sizeof(int) * M->total_col);
    assert(num != NULL);
    //用于记录每一列的应该存储在数组的下标位置
    int* cpos = (int*)malloc(sizeof(int) * M->total_col);    
    assert(cpos != NULL);
    
    int col = 0;
    //初始化num 
    for(col = 0;col < M->total_col;col++)
        num[col] = 0;
    
    //遍历所有的非零元素,记录每一列非零元素的个数
    int i = 0;
    for(i = 0;i < M->not_zero_count;i++){
        col = M->data[i].col;
        num[col]++; 
    } 
    
    //初始化第一列的元素在对应起始下标位置为0 
    cpos[0] = 0;
    //其他列为上一列的起始位置加上一列非零元素的个数 
    for(col = 1;col < M->total_col;col++){
        cpos[col] = cpos[col - 1] + num[col - 1];
    }
    
    //进行转置
    int pos = 0;
    for(i = 0;i < M->not_zero_count;i++){
        //获取该元素所在列 
        col = M->data[i].col;
        //获取该元素应该存储在目标数组的下标 
        pos = cpos[col]; 
        
        T->data[pos].value = M->data[i].value;
        T->data[pos].col = M->data[i].row;
        T->data[pos].row = M->data[i].col;
        //该列的下一个元素存储在目标数据下标 
        cpos[col]++;
    } 
}

3、其他方法实现

void PrintMatrix(SMatrix *M){ 
    int i = 0;
    printf("row=%d, col=%d\n",M->total_row,M->total_col); 
    for(i = 0;i < M->not_zero_count;i++){
        //注意:行和列从0开始
        printf("(%d,%d,%d)\n",M->data[i].row,M->data[i].col,M->data[i].value);
    }
}

void CopyMatrix(SMatrix *M, SMatrix *T){
    T->total_row = M->total_row;
    T->total_col = M->total_col;
    T->not_zero_count = M->not_zero_count;
    
    int k = 0;
    for(k;k < M->not_zero_count;k++){
        T->data[k].row = M->data[k].row; 
        T->data[k].col = M->data[k].col; 
        T->data[k].value = M->data[k].value; 
    }
}

 

标签:11,存储,int,矩阵,++,total,data,col,row
From: https://www.cnblogs.com/xpp3/p/18434962

相关文章

  • 淘客导购系统的分布式存储与管理
    淘客导购系统的分布式存储与管理大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来深入探讨一下淘客导购系统中的分布式存储与管理。随着用户量的增大和数据规模的扩展,单一数据库和存储方案已经无法满足高并发和大规模数据处理的需求。......
  • P10681 COTS/CETS 2024 奇偶矩阵 Tablica
    P10681COTS/CETS2024奇偶矩阵Tablica来自qnqfff大佬的梦幻dp。约定二元组\((n,m)\)表示一个\(n\)行\(m\)列的矩形。不添加说明的子问题,限制与题面一致。思路先考虑放最后一行,发现你填的位置经过变换后可以得到其他的结果,也就是说只要乘上变换的方案数就可以任......
  • 8、串的顺序存储
    1、代码实现#include<stdio.h>#include<malloc.h>#include<assert.h>#include<string.h>//"abcdef"=>"abcdef/0//用数组第一个空间存储字符串长度5abcef#defineMAX_STR_LEN20#defineu_charunsignedchar//串结构顺序存储定义typede......
  • 易优CMS【错误代码】 SQLSTATE【42S02】:Base table or view not found:1146 Table‘111
    当你遇到“数据表或视图不存在”的错误提示时,通常是因为数据库中缺少某个表或视图。以下是一些具体的解决步骤:步骤1:确认表是否存在检查数据库表使用数据库管理工具(如phpMyAdmin)打开数据库。检查数据库中是否存在表 ey_admin_theme。如果表不存在,需要创建该表。步骤......
  • 11 time&datetime
    UTC/GMT:世界时间本地时间:本地时区的时间。全球总共:24个时区东12+西12区4.3.1time模块p180time.time(),时间戳:1970-1-100:00当前经历的秒数time.sleep(10),等待秒数。time.timezone得到相差的秒数,跟电脑设置的时区有关系。#https://login.wx.qq.com/cgi-bin/......
  • 【洛谷】P1168 中位数 的题解
    【洛谷】P1168中位数的题解题目传送门题解不懂就问,这是什么标签啊,《线段树》《二分》《堆》《树状数组》qaq谔谔,教练讲的这是一题线段树,看半天看不出来,也不会做,只好去看题解。其他的题解讲什么主席树,平衡树,分块,结果看完第一篇人都傻了。什么东西嘛qaq(恼vector直接一......
  • 11-12-13 926
      这段文本讨论了文明社会中人们应有的自律性,以及缺乏自律可能导致的问题。以下是详细解释:###英文原文整理:1.Andthis,inmyopinion,ishowthingsshouldbeinacivilizedsociety.2.Butpeoplewhohavebeenliberatedfromtheharshdisciplineofcir......
  • 11. 名称空间
    一、什么是名称空间  名称空间(namespace)指的是变量存储的位置,是对栈区的划分。每一个变量都需要存储到指定的名称空间中。每一个作用域都会有一个它对应的名称空间。名称空间主要分为内置名称空间、全局名称空间和局部名称空间三种。名称空间实际上就是一个字典,是一个专门......
  • Debian 11 安装与配置 SMB
    1.安装samba等相关服务sudoaptinstallsambasmbclientcifs-utils2.配置组及用户1)建立smb访问目录sudomkdir/mnt/scan2)建组sudogroupaddsmbscan3)建立用户sudouseradd-M-s/sbin/nologinscanner4)设置群组sudousermod-aGsmbscanscanner5)设置SMB用户密......
  • 浮点数在内存中的存储
    引入        首先来看一下以下这段代码:intmain(){ intn=1; float*pf=(float*)&n; printf("%d\n",n); printf("%f\n",*pf); *pf=1.0; printf("%d\n",n); printf("%f\n",*pf); return0;}        这里大多数人可能会......