稀疏矩阵(表示、转置)

这篇具有很好参考价值的文章主要介绍了稀疏矩阵(表示、转置)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、稀疏矩阵的三元组表示法

1.1 稀疏矩阵非零元素的三元组存储表示

1.2 稀疏矩阵三元组表的类型定义

二、用三元组实现稀疏矩阵的转置运算 

2.1 方法一:列序递增转置法 

2.1.1 算法思想

2.1.2 算法实现

2.2 方法二:一次定位快速转置法 

2.2.1 算法思想

2.2.2 算法实现 


一、稀疏矩阵的三元组表示法

1.1 稀疏矩阵非零元素的三元组存储表示

对于稀疏矩阵的压缩存储,采取只存储非零元素的方法。

由于稀疏矩阵中非零元素的分布没有规律,因此在存储非零元素值的同时,还必须存储该非零元素在矩阵中所处的行号和列号的位置信息,即按三元组的结构存储。 

如图所示: 

稀疏矩阵a(n行m列,非零元素数为t)采用三元组b表示,那么在三元组中访问a[i][j]所需,数据结构——用C语言描述,矩阵,算法,数据结构,c语言

为处理方便,将稀疏矩阵中的非零元素对应的三元组按行序为主序的一维结构数组进行存储,即将矩阵每一行(行有小到大)的全部非零元素的三元组按列号递增存储。 

如图所示:

稀疏矩阵a(n行m列,非零元素数为t)采用三元组b表示,那么在三元组中访问a[i][j]所需,数据结构——用C语言描述,矩阵,算法,数据结构,c语言

1.2 稀疏矩阵三元组表的类型定义

#define MAXSIZE 1000
#define ElementType int

/* 定义三元组的类型 */
typedef struct {
    ElementType e;   /* 该非零元素的值 */
    int row, col;    /* 该非零元素的行值和列值*/
} Triple;

/* 定义稀疏矩阵的类型 */
typedef struct {
    Triple data[MAXSIZE + 1];   /* 非零元素的三元组表,其中data[0]被弃用 */
    int m, n, len;              /* 稀疏矩阵的行数、列数以及非零元素的个数 */
} TSMatrix;

二、用三元组实现稀疏矩阵的转置运算 

2.1 方法一:列序递增转置法 

2.1.1 算法思想

算法思想:按照被转置矩阵三元组表A的列序递增的顺序进行转置,并依次送入转置后矩阵的三元组表B中。这样一来,转置后矩阵的三元组表B恰好是以行序为主序。

如图所示:

稀疏矩阵a(n行m列,非零元素数为t)采用三元组b表示,那么在三元组中访问a[i][j]所需,数据结构——用C语言描述,矩阵,算法,数据结构,c语言

2.1.2 算法实现

void TransposeTSMatrix(TSMatrix *from, TSMatrix *to) {
    int i, j, k;

    /* 交换基本数据 */
    to->m = from->n;
    to->n = from->m;
    to->len = from->len;

    if (to->len == 0)
        return;

    j = 1;
    for (k = 1; k <= from->n; ++k)
    /* 扫描三元组表from共from->n次,每次寻找列值为k的三元组进行转置 */
        for (i = 1; i <= from->len; ++i)
        /* 从头到尾扫描三元组表from,寻找行值为k的三元组进行转置 */
            if (from->data[i].col == k) {
                to->data[j].row = from->data[i].col;
                to->data[j].col = from->data[i].row;
                to->data[j].e = from->data[i].e;
                ++j; /* j加1,指向下一个转置后元素的位置下标 */
            }
}

2.2 方法二:一次定位快速转置法 

2.2.1 算法思想

为了能将被转置三元组表from中的元素一次定位到三元组表to的正确位置上,需要预先计算以下数据:

1、待转置矩阵三元组表from每一列非零元素的总个数;

2、待转置矩阵每一列中第一个非零元素在三元组表to中的正确位置。

为此,需要设数组num和数组position来分别存放总个数和正确位置。

如图所示:

稀疏矩阵a(n行m列,非零元素数为t)采用三元组b表示,那么在三元组中访问a[i][j]所需,数据结构——用C语言描述,矩阵,算法,数据结构,c语言

数组num的计算方法:

将三元组表from扫描一遍,对于其中列号为col的非零元素,给相应的num数组中下标为col的元素加1。

数组position的计算方法:

1、position[1] = 1:三元组表from的第1列的第一个非零元素在三元组表to中的下标值为1。

2、position[col] = position[col - 1] + num[col - 1]。文章来源地址https://www.toymoban.com/news/detail-740479.html

2.2.2 算法实现 

void FastTransposeTSMatrix(TSMatrix *from, TSMatrix *to) {
    to->len = from->len;
    to->n = from->m;
    to->m = from->n;
    if (to->len) {
        int i, j, col;
        int num[MAXSIZE], position[MAXSIZE];
        
        /* 计算num数组 */
        for (i = 1; i <= from->n; ++i)
            num[i] = 0;
        for (i = 1; i <= from->len; ++i)
            ++num[from->data[i].col]; 

        /* 计算position数组 */
        position[1] = 1;
        for (col = 2; col <= from->n; ++col) 
            position[col] = position[col - 1] + num[col - 1];

        /* 将被转置矩阵的三元组表from从头至尾扫描一次,实现矩阵转置 */
        for (i = 1; i <= from->len; ++i) { 
            col = from->data[i].col; j = position[col];

            to->data[j].row = from->data[i].col;
            to->data[j].col = from->data[i].row;
            to->data[j].e = from->data[i].e;
            /* position[col]加1,指向下一个列号为col的非零元素在三元组表to中的下标值*/
            ++position[col]; 
        }
    }
}

到了这里,关于稀疏矩阵(表示、转置)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 稀疏矩阵的表示以及转置

    目录 1.稀疏矩阵概念 2.三元组表 3.稀疏矩阵的转置  4.题目实现 矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵。 图示:   在存储稀疏矩阵时,为了节省存储单元,很自然地想到使用压缩存储方法。但由于非零元

    2024年02月02日
    浏览(38)
  • 稀疏矩阵(三元组)的创建,转置,遍历,加法,减法,乘法。C实现

    1.创建。 可以直接赋值字符串,但是为0的元素也要依次赋值,比较麻烦,但是容易理解也能实现。 其次也可以构思三元组赋值,只赋值非零元素和它的行,列数,在打印时进行if判断,没有赋值的就输出0,这样比较简单。 创建结构体时,一个矩阵需要有它的行总数和列总数

    2024年02月02日
    浏览(54)
  • 数据结构·练习·三元组表法实现稀疏矩阵的转置

    一、问题描述 一个mxn的矩阵A,它的转置矩阵B是一个nxm矩阵,且A[i][j]=B[j][i],0=i=m-1,0=j=n-1,即A的行是B的列,A的列是B的行。 用三元组表对稀疏矩阵进行压缩存储,再进行时间复杂度O(n)的快速转置,最后输出稀疏矩阵。 其中m=4,n=5 二、算法概述 1、问题分析 1)压缩 2)转置

    2024年02月04日
    浏览(43)
  • 数组:矩阵快速转置 矩阵相加 三元组顺序表/三元矩阵 随机生成稀疏矩阵 压缩矩阵【C语言,数据结构】(内含源代码)

    目录 题目: 题目分析: 概要设计: 二维矩阵数据结构: 三元数组三元顺序表顺序表结构: 详细设计: 三元矩阵相加: 三元矩阵快速转置: 调试分析: 用户手册: 测试结果:  源代码: 主程序:  头文件SparseMatrix.h:  头文件Triple.h: 总结: 稀疏矩阵A,B均采用 三元组

    2023年04月26日
    浏览(60)
  • [数据结构(C语言版本)上机实验]稀疏矩阵的三元组顺序表压缩存储以及转置实现(含快速转置)

    实现效果: 1、编写程序任意 输入 一个稀疏矩阵,用 三元组顺序表 压缩存储 稀疏矩阵 。 2、对稀疏矩阵进行 转置 , 输出 转置后的矩阵。 对应《数据结构(C语言版)》 第5章 数组与广义表 实验: 1、 掌握下三角矩阵的输入、输出、压缩存储算法; 2、 理解稀疏矩阵的三元

    2024年02月03日
    浏览(42)
  • 【C 数据结构】以三元组表形式表示稀疏矩阵,实现两个矩阵的加法、减法

    目的:以三元组表形式表示稀疏矩阵,实现两个矩阵的加法、减法。 实验步骤 1. 定义三元组存储结构 2. 输入稀疏矩阵:首先应输入矩阵的行数、列数和非零项的数目,并判别给出的两个矩阵的行、列数对于所要求进行的运算是否匹配。可设矩阵的行数和列数均不超过20。接

    2024年02月12日
    浏览(46)
  • 数据结构第七周 :(稀疏矩阵快速转置 + 简单文本编辑器 + 三元组的矩阵加法 + 九宫格数独游戏 + 数组主元素 + 螺旋数字矩阵 + 蛇形矩阵)

    【问题描述】 稀疏矩阵的存储不宜用二维数组存储每个元素,那样的话会浪费很多的存储空间。所以可以使用一个一维数组存储其中的非零元素。这个一维数组的元素类型是一个三元组,由非零元素在该稀疏矩阵中的位置(行号和列号对)以及该元组的值构成。而矩阵转置就

    2023年04月21日
    浏览(40)
  • 三元组(C++ 实现矩阵快速转置)

      三元组稀疏矩阵是一种高效存储稀疏矩阵的方法。它通过记录矩阵中非零元素的行、列和值来表示一个稀疏矩阵。我们在三元组里存储的是每个元素的行、列以及值。 题目:   任意输入一个稀疏矩阵M,用三元组顺序表压缩存储该稀疏矩阵M,然后求其转置矩阵T,并输出转

    2024年02月08日
    浏览(37)
  • 稀疏矩阵的加法和乘法(三元组)

    三元组方法: 主要的特点就是最后的结果矩阵均由三元组的形式来表达,调用函数再以矩阵形式输出 (1)稀疏矩阵加法 (下图参考懒猫老师《数据结构》课程相关笔记)  这里与普通矩阵加法不同的是,稀疏矩阵的三元组在加法计算时, 如果两个矩阵中的元素相加不为0时

    2024年01月17日
    浏览(44)
  • 三元组操作(相加)——稀疏矩阵(c语言)

     运行环境:TDM-GCC 三元组用来存储 稀疏矩阵 比较节省空间,因为稀疏矩阵大部分都是零元素,而三元组只记录非零元素。 这里两个相加的矩阵有着同样的 i行 j列。 运行结果:         行数:3 列数:4  元素个数:4         --------------------         第0 行  第1 列  1    

    2024年02月05日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包