iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++稀疏矩阵怎么实现
  • 718
分享到

C++稀疏矩阵怎么实现

2023-06-30 15:06:56 718人浏览 薄情痞子
摘要

这篇文章主要讲解了“c++稀疏矩阵怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++稀疏矩阵怎么实现”吧!稀疏矩阵矩阵与稀疏矩阵的定义Q:什么是矩阵A:数学上,一个矩阵由 m 行

这篇文章主要讲解了“c++稀疏矩阵怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++稀疏矩阵怎么实现”吧!

    稀疏矩阵

    矩阵与稀疏矩阵的定义

    Q:什么是矩阵

    A:数学上,一个矩阵由 m 行 n 列的元素组成,是一个 m 行,n 列的表,m 和 n 是矩阵的维度。一般地,写作 mxn(读作“m乘n”)来指明一个 m 行 n 列矩阵。矩阵的元素个数总计为 mn 个。如果 m 等于 n ,矩阵为方阵。

    C++稀疏矩阵怎么实现

    一般情况下,矩阵的标准存储方式是一个二维数组 a[MAX_ROWS][MAX_COLS] 。利用这种存储方式,可以通过 a[i][j] ,通过行下标,列下标快速找到任意元素的存储位置。

    Q:什么是稀疏矩阵

    A:一个矩阵的绝大部分都为零元素,我们把这种矩阵称为稀疏矩阵。

    C++稀疏矩阵怎么实现

    如图:矩阵中只有 2/15 是非零元素,这就是一个标准的稀疏矩阵

    Q:二维数组储存矩阵的缺点

    A:如果一个矩阵中包含很多零元素(是稀疏矩阵),就会浪费大量的存储空间。因此,稀疏矩阵的存储表示只需存储非零元素。

    Q:稀疏矩阵的存储方式

    A:通过对矩阵的分析,我们发现使用三元组 <row,col,value> 能够唯一的刻画矩阵的任意一个元素。这意味者可以使用三元数组来存储表示稀疏矩阵。

    代码演示

    #define MAX_TERMS 101//定义最大长度 typedef struct{int col;int row;int xalue;}term;term a[MAX_TERMS];

    我们可以用 a[0].row 表示行的数目,用 a[0].col 表示列的数目,用 a[0].value 表示非零元素的总数。其他位置 row 域存放行下标, col 域存放列下标,value 域存放元素值。三元组按照行的顺序排序,并且在同一行内按照列的顺序排序。

    稀疏矩阵存储为三元组

     
     
    a[0]564
    a[1]0015
    a[2]1111
    a[3]236
    a[4]409

    稀疏矩阵的转置

    详细思路

    为了转置一个矩阵,必须交换它的行和列。也就是说,原矩阵的任意元素 a[i][j] 应该成为其转置矩阵的元素 b[j][i]

    思路一

    依次循环每一列,找到每一列的所有元素并把他们储存在转置矩阵的对应的行上。

    //伪代码
    for 对于 j 列的所有元素
        把元素<i,j,value>放置在元素<j,i,value>中

    代码演示

    void transpose(term a[],term b[])//b是a的转置 {int n,i,j,currentb;n=a[0].value;//元素总数 b[0].row=a[0].col;//b的行数=a的列数b[0].co 1=a[0].row;    //b的列数=a的行数b[0].value =n;if(n> 0) {// 非零矩阵 currentb=1;for(i=0;i<a[0].col;i++)//按a的列转置for(j=1;j<=n;j++)//找出当前列的所有元素if(a[j].col==i){//元素是当前列的,加入bb[currentb]. row=a[j]. col;b[currentb]. col=a[j]. row;b[currentb]. value=a[j]. value;currentb++;}}}
    思路二

    首先确定原矩阵中每一列的元素个数,这也就是其转置矩阵中每一行的元素个数。于是就可以得到转置矩阵每行的起始位置,从而,可以将原矩阵的元素依次移到其转置矩阵中的恰当位置。

    代码演示

    void fast transpose(term a[], term b[]){//将a的转置矩阵存放于b中 int row terms[MAX_COL], starting pos[MAX_COL]; int i,j, num_cols=a[0].col, num_terms=a[0].value;b[0].row=num_cols;b[0].col=a[0].row;b[0].value=num_terms;if(num_terms>0){//非零矩阵for(i=0;i<num_cols;i++)row_terms[i]=0;for(i=1;i<=num_terms;i++)row_terms[a[i]. co]]++;starting_pos[0]=1;for(i=1;i<num cols;i++)starting_pos[i]=starting_pos[i-1]+row_terms[i-l];for(i=1;i<=num_terms;i++){j=starting_pos[a[i].col]++;b[j].row=a[i].col;b[j].col=a[i].row;b[j].value=a[i].value;}}}

    稀疏矩阵的乘法

    Q:什么是矩阵乘法

    A:设A为 mxp 的矩阵,B为 pxn 的矩阵,那么称 mxn 的矩阵D为矩阵A与B的乘积,记作D=AB,其中矩阵D中的第 i 行第 j 列元素可以表示为:

    C++稀疏矩阵怎么实现

    注意:两个稀疏矩阵的乘积可能不再是稀疏矩阵

    详细思路

    我们可以按照行的顺序计算D的元素,把元素存放到正确的位置,这样就不用移动已计算出的元素的位置。一般情况下,必须遍历整个B才能得到第 j 列的所有元素。但是,我们可以先计算 B 的转置,使列元素顺序相续排序,可以避免重复多次遍历整个 B 。

    对于找出的 A 的第 i 行和 B 的第 j 列的所有元素,做合并操作就能实现矩阵乘法。

    代码演示

    void storesum(term a[],int *totald,int row,int column,int *sum){//如果 *sum!=0,它的行和列存储位置为 d 中的 *totald+1if(*sum)if(*tptald<MAX_TERMS){d[++*totald].row=row;d[*totald].col=column;d[*totald].value=*sum;*sum=0;}else{fprintf(stderr,"Numbers of terms in product exceeds %d\n",MAX_TERMS); exit(1);}}void mmult(term a[], term b[], term d[])//将两个稀疏矩阵相乘 {int i,j,column,totalb=b[0].value,totald=0; int rows_a=a[0].row,cols_a=a[0].col;totala=a[0].value;int cols_b=b[0].col;int row_begin=1, row=a[1].row, sum=0; int new_b[MAX-TERMS][3];if(cols_a!=b[0].row){fprintf(stderr,"Incompatible matrices\n"); exit(1);}fast_transpose(b.new_b);//设置边界条件a[totala+1].row=rows_a;new_b[totalb+1].row=cols_b; new_b[totalb+1].col=0;for(i=1;i<=totala;){column=new_b[1].row; for(j=1;j<=totalb+1;){//将a的行乘以b的列if(a[i].row!=row){storesum(d,&totald,row,column,&sum);i=row_begin;for(;new_b[j].row==column;j++);column=new_b[j]. row;}else if(new_b[j].row!=column){storesum(d,&totald,row,column,&sum); i=row_begin;column=new_b[j].row;}else switch(COMPARE(a[i].col,new_b[j].col)){case-1://转到a中的下一项i++;break;case 0://添加项,转到a和b的下一项 sum+=(a[i++].value*new_b[j++].value); break;case 1://来到b的下一项j++;}}// for j<=totalb+1 结束循环 for(;a[i].row==row;i++);row_begin=i;row=a[i].row;}//for i<=totala 结束循环 d[0].row=rows_a;d[0].col=cols_b;d[0].value=totald;}

    感谢各位的阅读,以上就是“C++稀疏矩阵怎么实现”的内容了,经过本文的学习后,相信大家对C++稀疏矩阵怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    --结束END--

    本文标题: C++稀疏矩阵怎么实现

    本文链接: https://www.lsjlt.com/news/330119.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • C++稀疏矩阵怎么实现
      这篇文章主要讲解了“C++稀疏矩阵怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++稀疏矩阵怎么实现”吧!稀疏矩阵矩阵与稀疏矩阵的定义Q:什么是矩阵A:数学上,一个矩阵由 m 行 ...
      99+
      2023-06-30
    • numpy稀疏矩阵的实现
      目录1. coo存储方式2. dok_matrix3. csr和csc存储方式4. lil_matrix5. dia_matrix6. 稀疏矩阵经验1. coo存储方式 采用三元组(...
      99+
      2024-04-02
    • C++超详细讲解稀疏矩阵
      目录稀疏矩阵矩阵与稀疏矩阵的定义稀疏矩阵的转置详细思路思路一思路二稀疏矩阵的乘法详细思路稀疏矩阵 矩阵与稀疏矩阵的定义 Q:什么是矩阵 A:数学上,一个矩阵由 m 行 n 列的元素组...
      99+
      2024-04-02
    • Scipy稀疏矩阵bsr_array的使用
      目录基本原理初始化内置方法基本原理 bsr,即Block Sparse Row,bsr_array即块稀疏行矩阵,顾名思义就是将稀疏矩阵分割成一个个非0的子块,然后对这些子块进行存储...
      99+
      2023-02-21
      Scipy稀疏矩阵bsr_array Scipy稀疏矩阵 Scipy bsr_array
    • python的高级数组之稀疏矩阵
        稀疏矩阵的定义: 具有少量非零项的矩阵(在矩阵中,若数值0的元素数目远多于非0元素的数目,并且非0元素分布没有规律时,)则称该矩阵为稀疏矩阵;相反,为稠密矩阵。非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。 稀疏矩阵的两个动...
      99+
      2023-01-31
      稀疏 数组 矩阵
    • Scipy稀疏矩阵bsr_array如何使用
      本篇内容主要讲解“Scipy稀疏矩阵bsr_array如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scipy稀疏矩阵bsr_array如何使用”吧!基本原理bsr,即Block Spa...
      99+
      2023-07-05
    • Python稀疏矩阵scipy.sparse包使用详解
      目录1. 前言2. 导入包3. 稀疏矩阵总览4. 稀疏矩阵详细介绍4.1 coo_matrix4.2 dok_matrix4.3 lil_matrix4.4 dia_matrix4....
      99+
      2023-02-16
      Python稀疏矩阵 Python scipy.sparse包
    • Python实现两种稀疏矩阵的最小二乘法
      目录最小二乘法返回值测试最小二乘法 scipy.sparse.linalg实现了两种稀疏矩阵最小二乘法lsqr和lsmr,前者是经典算法,后者来自斯坦福优化实验室,据称可以比lsqr...
      99+
      2023-02-26
      Python稀疏矩阵最小二乘法 Python稀疏矩阵 Python 最小二乘法
    • Python 如何解决稀疏矩阵运算
      用Python求解微分线性方程 因为之前用matlab也编写过,所以前不久试着用python写,感觉之间互通点也蛮多的,易理解。 题目:稀疏线性方程组的求解方法 简单的方程如: AX...
      99+
      2024-04-02
    • java实现稀疏矩阵的压缩与解压的方法
      目录任务要求思路分析稀疏矩阵的压缩稀疏矩阵的解压代码实现任务要求 把棋盘当作一个稀疏矩阵,0表示没棋,1表示黑棋,2表示蓝棋。 把该稀疏矩阵压缩以三元组形式表示并以文件形式保存,再写...
      99+
      2024-04-02
    • Python如何实现两种稀疏矩阵的最小二乘法
      今天小编给大家分享一下Python如何实现两种稀疏矩阵的最小二乘法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。最小二乘法s...
      99+
      2023-07-05
    • 华为OD机试 - 矩阵稀疏扫描(Java & JS & Python)
      题目描述 如果矩阵中的许多系数都为零,那么该矩阵就是稀疏的。对稀疏现象有兴趣是因为它的开发可以带来巨大的计算节省,并且在许多大的实践中都会出现矩阵稀疏的问题。 给定一个矩阵,现在需要逐行和逐列地扫描矩阵,如果某一行或者某一列内,存在连续出现...
      99+
      2023-09-01
      算法 华为机试 Java JavaScript Python
    • 【华为OD统一考试B卷 | 100分】矩阵稀疏扫描(C++ Java JavaScript Python)
      华为OD在线OJ 已购买本专栏用户,请私信博主开通账号,在线刷题!!! 在线OJ:立即刷题 题库专栏:2023华为OD机试(A卷+B卷)(C++JavaJSPy) 题目描述 如果矩阵中的许多系数都为零...
      99+
      2023-10-05
      矩阵 c++ java python 华为
    • C++怎么实现螺旋矩阵
      本篇内容介绍了“C++怎么实现螺旋矩阵”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!螺旋矩阵Given a positive integer...
      99+
      2023-06-20
    • C++怎么实现矩阵赋零
      这篇文章主要介绍“C++怎么实现矩阵赋零”,在日常操作中,相信很多人在C++怎么实现矩阵赋零问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么实现矩阵赋零”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
      99+
      2023-06-20
    • scipy稀疏数组coo_array的实现
      目录coo_array初始化方案内置方法coo_array coo也被称为ijv,是一种三元组格式,对于矩阵中第i ii行第j jj列的值v vv,将其存储为( i , j , v ...
      99+
      2023-02-21
      scipy稀疏数组coo_array scipy稀疏数组
    • scipy稀疏数组coo_array如何实现
      这篇文章主要讲解了“scipy稀疏数组coo_array如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“scipy稀疏数组coo_array如何实现”吧!coo_arraycoo也被称...
      99+
      2023-07-05
    • c#矩阵怎么写
      在 c# 中创建矩阵的方法有:使用锯齿数组:创建一个数组的数组,每行元素数量可能不同。使用 jaggedarray 类:提供更简单的锯齿数组创建方法。使用 system.numerics...
      99+
      2024-05-12
      c#
    • mat矩阵和npy矩阵怎么实现互相转换
      这篇“mat矩阵和npy矩阵怎么实现互相转换”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mat矩阵和npy矩阵怎么实现互相...
      99+
      2023-07-02
    • python共现矩阵怎么实现
      本篇内容主要讲解“python共现矩阵怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python共现矩阵怎么实现”吧!什么是共现矩阵比如我们有两句话:ls = [&#...
      99+
      2023-07-06
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作