三元组((x,y),z)其中(x,y)表示非零元位置,z表示该坐标的值

由于实际操作时,我们所用的矩阵0非常多,所以一个一个输入值很浪费时间,也浪费空间,所以用一些三元组表示非零元即能表示一个矩阵

三元组稀疏矩阵表示一些图也是很不错的选择


这样就很浪费空间,三元组直接

((0,1),1)
((1,2),1)
((3,4),1)
((5,6),1)
((7,8),1)

下面是稀疏矩阵代码:

#include <iostream>
#include<malloc.h>
#include<stdio.h>
#define SMAX 1000using namespace std;typedef struct
{int i,j;          //储存非零元素的行和列信息int  v;            //非零元素的值
} SPNode;       //定义三元组类型typedef struct
{int row,col,notZero; //矩阵的行、列和非零元素的个数SPNode data[SMAX]; //三元组表
} SPMatrix;void printMatrix(SPMatrix m);SPMatrix createMatrix()
{cout<<"enter row and col and notZero"<<endl;int row,col, notZero;cin>>row >>col >>notZero;SPMatrix matrix;matrix.row = row;matrix.col = col;matrix.notZero = notZero;for(int k = 1; k <= notZero; k++){cout <<"enter each row and col and value"<<endl;cin >> matrix.data[k].i >>matrix.data[k].j>>matrix.data[k].v;}cout <<"三元组:"<<endl;for(int k = 1; k <= notZero; k++){cout <<"(("<<matrix.data[k].i<<"," << matrix.data[k].j<<")"<<matrix.data[k].v<<"))"<<endl;}
//    printMatrix(matrix);return matrix;
}void printMatrix(SPMatrix m)
{int row = m.row;int col = m.col;int show[row][col]= {0};//初始化矩阵for(int i=0; i<row; i++){for(int j=0; j<col; j++){show[i][j]=0;}}for(int k=1; k<=m.notZero; k++){show[m.data[k].i-1][m.data[k].j-1] = m.data[k].v;}for(int i=0; i<row; i++){for(int j=0; j<col; j++){cout<<show[i][j]<<" ";}cout<<endl;}
}SPMatrix add(SPMatrix m1,SPMatrix m2)
{if(m1.row!=m2.row || m1.col!=m2.col){cout<<"wrong"<<endl;return m1;}int flag = 0;int num = m1.notZero;int m;for(int k = 1; k <= num; k++){for(m = 1; m <= m2.notZero; m++){if(m1.data[k].i == m2.data[m].i && m1.data[k].j == m2.data[m].j){m2.data[k].v += m1.data[m].v;flag = 1;break;}}if(flag ==0) //当前位置m2和m1未重合{m2.notZero++;m2.data[m2.notZero] = m1.data[k];}flag = 0;}return m2;
}
SPMatrix sub(SPMatrix m1,SPMatrix m2)
{if(m1.row!=m2.row || m1.col!=m2.col){cout<<"wrong"<<endl;return m1;}int flag = 0;int num = m1.notZero;int m;for(int k = 1; k <= num; k++){for(m = 1; m <= m2.notZero; m++){if(m1.data[k].i == m2.data[m].i && m1.data[k].j == m2.data[m].j){m2.data[k].v -= m1.data[m].v;flag = 1;break;}}if(flag ==0) //当前位置m2和m1未重合{m2.notZero++;m2.data[m2.notZero] = m1.data[k];m2.data[m2.notZero].v = -m1.data[k].v;}flag = 0;}return m2;
}
SPMatrix numMul(SPMatrix m)
{int num ;cout <<"输入数乘的数:"<<endl;cin >> num;for(int k = 1; k <= num; k++){m.data[k].v *= num;}return m;
}int isExist(SPMatrix m,SPNode a){for(int i=1;i<=m.notZero;i++)if(m.data[i].i == a.i &&m.data[i].j == a.j)return i;return 0;
}
SPMatrix Mul(SPMatrix m1,SPMatrix m2)
{if(m1.col != m2.row){cout<<"wrong"<<endl;return m1;}SPMatrix result;result.row = m1.row;result.col = m2.col;result.notZero = 0;//初始化SPNode data[m1.notZero+m2.notZero];int n = 0;for(int k = 1; k <= m1.notZero; k++){for(int m = 1; m <= m2.notZero; m++){if(m1.data[k].j == m2.data[m].i){data[n].v = m1.data[k].v*m2.data[m].v;data[n].i = m1.data[k].i;data[n].j = m2.data[m].j;n++;continue;}}}int flag = 0;for(int k =0;k<n;k++){flag = isExist(result,data[k]);if(flag>0){result.data[flag].v+=data[k].v;}else{result.notZero++;result.data[result.notZero] = data[k];}}return result;
}int main()
{int num = 0;do{cout<<"***********************************\n";cout<<"*              菜单                *\n";cout<<"*          1.矩阵相加               *\n";cout<<"*          2.矩阵相减               *\n";cout<<"*          3.矩阵相乘               *\n";cout<<"*          4.矩阵数乘               *\n";cout<<"*          6.退出                  *\n";cout<<"***********************************\n";cin>>num;if(1 == num|| 2 == num || 3 == num){SPMatrix m1 = createMatrix();SPMatrix m2 = createMatrix();cout<<"两矩阵为"<<endl;printMatrix(m1);cout<<endl;printMatrix(m2);switch(num){case 1:{if(m1.col!=m2.col || m1.row!=m2.row){cout<<"行列不同"<<endl;}else{cout<<"结果为:"<<endl;printMatrix(add(m1,m2));}break;}case 2:{if(m1.col!=m2.col || m1.row!=m2.row){cout<<"参数错误"<<endl;}else{cout<<"结果为:"<<endl;printMatrix(sub(m1,m2));}break;}case 3:{if(m1.col!=m2.row){cout<<"参数错误"<<endl;}else{cout<<"结果为:"<<endl;printMatrix(Mul(m1,m2));}break;}default:break;}}else if(4 == num){int number = 1;cout<<"请输入矩阵"<<endl;SPMatrix m  = createMatrix();cout<<"请输入数值"<<endl;cin>>number;cout<<"矩阵为:"<<endl;printMatrix(m);printMatrix(numMul(m));}cout<<"按回车继续....";getchar();getchar();system("cls");}while(1 == num|| 2 == num || 3 == num ||4 == num);return 0;
}

转载于:https://www.cnblogs.com/xiatom/p/10784863.html

C/C++利用三元组实现稀疏矩阵运算相关推荐

  1. HuggingFace又出炼丹神器!稀疏矩阵运算进入平民化时代!

    文 | rumor酱 编 | YY 一提到模型加速,大家首先想到的就是蒸馏.(结构性)剪枝.量化(FP16),然而稀疏矩阵(sparse matrix)运算一直不被大家青睐.原因也很简单,一是手边没有 ...

  2. 利用三元组对稀疏矩阵进行压缩存储并实现矩阵的转置运算

    我们假设在m*n的矩阵中,有t个元素不为0,令a=t/(m*n),称a为矩阵的稀疏因子,通常认为a<=0.05时称为稀疏矩阵. 为了节省存储空间,我们对稀疏矩阵进行压缩存储--只存储稀疏矩阵的非 ...

  3. Python稀疏矩阵运算库scipy.sparse用法精要

    1.稀疏矩阵的常见存储形式 bsr_matrix(arg1[, shape, dtype, copy, blocksize]) Block Sparse Row matrix coo_matrix(a ...

  4. 数据结构使用c语言第5版答案,数据结构(c语言版)第五章答案.doc

    数据结构(c语言版)第五章答案.doc 第五章1.设二维数组A[8][10]是一个按行优先顺序存储在内存中的数组,已知A[0][0]的起始存储位置为1000,每个数组元素占用4个存储单元,求(1)A[ ...

  5. 随机生成稀疏矩阵_面向异构众核超级计算机的大规模稀疏计算性能优化研究

    点击上方蓝字关注我们 面向异构众核超级计算机的大规模稀疏计算性能优化研究 胡正丁, 薛巍 清华大学计算机科学与技术系,北京 100084 论文引用格式: 胡正丁, 薛巍.面向异构众核超级计算机的大规模 ...

  6. 面向异构众核超级计算机的大规模稀疏计算性能优化研究

    点击上方蓝字关注我们 面向异构众核超级计算机的大规模稀疏计算性能优化研究 胡正丁, 薛巍 清华大学计算机科学与技术系,北京 100084 论文引用格式: 胡正丁, 薛巍.面向异构众核超级计算机的大规模 ...

  7. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY11-特征选择和稀疏学习

    特征工程是机器学习中非常重要的一个环节,它的好坏直接影响了机器学习效果的优劣.而特征工程里非常关键的一步就是特征选择. 如果把机器学习比作是一个厨师做菜的过程,那么数据就是原材料(菜),模型可以理解为 ...

  8. 线性稀疏自编码机_特征工程之特征缩放amp;特征编码

    机器学习入门系列(2)--如何构建一个完整的机器学习项目,第五篇! 本篇文章会继续介绍特征工程的内容,这次会介绍特征缩放和特征编码,前者主要是归一化和正则化,用于消除量纲关系的影响,后者包括了序号编码 ...

  9. 神经稀疏体素场论文笔记

    论文地址:https://proceedings.neurips.cc/paper/2020/file/b4b758962f17808746e9bb832a6fa4b8-Paper.pdf Githu ...

最新文章

  1. CENTOS php 7.0 +nginx 环境下 安装yaf框架
  2. 解决push的时候有时候会卡一下的问题
  3. 短篇连载(3),在校园里做比赛的那些日子,以及彻底告别钟爱的电子竞技事业...
  4. 一句SQL实现获取自增列操作
  5. 【Android 性能优化】布局渲染优化 ( 过渡绘制 | 自定义控件过渡绘制 | 布局文件层次深 | GPU 过渡绘制调试工具 | 背景过度绘制 )
  6. pytest文档3-pycharm运行pytest
  7. Cambridge Website in a page
  8. 循环首次适应算法_面向6G的极化编码链路自适应技术
  9. HALCON示例程序resistor.hdev通过不同焦距图像提取深度信息
  10. Go语言【第五篇】:Go条件语句
  11. 取色器——TakeColor绿色安全简单
  12. 优酷kux视频文件转换成mp4格式
  13. 云南省计算机云教室,“云教室”落户云南祥云这个小山村
  14. linux怎么调显卡风扇速度,Ubuntu下无显示器(服务器)手动调节Nvidia显卡风扇转速...
  15. c语言进程伪装,易语言程序伪装软件
  16. Sliding Window Maximum
  17. VirtualBox虚拟电脑控制台错误,不能为虚拟电脑打开一个新任务
  18. Google Earth Engine——MERRA-2 M2T1NXAER:1980-2022年气溶胶逐日数据集
  19. 财会法规与职业道德【7】
  20. 如何完成中文翻译日文在线翻译

热门文章

  1. Apache优化:修改最大并发连接数
  2. selenium webdriver - 结束进程
  3. Android四大基本组件介绍与生命周期
  4. [翻译]ASP.NET MVC 3 开发的20个秘诀(十二)[20 Recipes for Programming MVC 3]:缩放图片尺寸创建缩略图...
  5. 用C语言写PHP扩展
  6. Linux下gedit显示行号
  7. 灰度图像直方图均衡化公式及实现
  8. Windows7 32位机上,OpenCV中配置GPU操作步骤
  9. 【C++】C++11 STL算法(四):二分查找法(Binary search operations)、合并操作
  10. rockbox主题包安装_微信主题更改流程介绍!超火的猫和老鼠、小黄人等系列等你来设置...