稀疏矩阵------三元组存储---笔记
SparseMatrix.h
#include<cstdio>
#define maxTerms 30
typedef int DataType;
typedef struct {int row, col;DataType value;
}Triple;
typedef struct {int Rows, Cols, Terms; //三元组行数,列数,元素个数Triple elem[maxTerms];
}SparseMatrix;
SparseMatrix.cpp
#include"SparseMatrix.h"
#include<cstdlib>void createSMatrix(SparseMatrix &A)
{//从键盘输入建立一批三元组,建立稀疏矩阵的三元组表示。//约定输入行号为-1结束。int i, j, k, r, c;DataType val;printf("请输入矩阵的行数和列数:(空格隔开)\n"); scanf("%d %d", &r, &c);A.Rows = r; A.Cols = c; A.Terms = 0;printf("输入三元组:"); scanf("%d %d %d", &r, &c,&val);while (r != -1){if (A.Terms == 0) //三元表中暂无元素{A.elem[A.Terms].row = r;A.elem[A.Terms].col = c;A.elem[A.Terms++].value = val;}else{for (i == A.Terms - 1; i > 0; i--) //从后向前寻找适合插入的行{if (A.elem[i].row > r)A.elem[i + 1] = A.elem[i];elsebreak;}if (A.elem[i].row < r) //当前行号小要插入的行{A.elem[i + 1].row = r;A.elem[i + 1].col = c;A.elem[i + 1].value = val;}else //当前行号等于要插入的行{for (j = i; j >= 0; j--) //从后向前寻到适合插入的列{if (A.elem[j].col > col)A.elem[j + 1] = A.elem[j];elsebreak;}A.elem[j + 1].row = r;A.elem[j + 1].col = c;A.elem[j + 1].value = val;}A.Terms++;}printf("请输入三元组:");scanf("%d %d %d", &r, &c, &val);}
}
void printSMatrix(SparseMatrix & A)
{printf("矩阵行数为%d 列数为%d,非零元为%d\n", A.Rows, A.Cols, A.Terms);printf("三元组表依此为:\n");for (int i = 0; i < A.Terms; i++)printf("%3d,%3d,%5d\n", A.elem[i].row, A.elem[i].col, A.elem[i].value);
}
void Transpose(SparseMatrix &A, SparseMatrix &B) //转置
{int CurrentB, k, i;B.Rows = A.Cols; B.Cols = A.Rows; A.Terms = B.Terms;if (A.Terms > 0){CurrentB = 0; //转置三元组表存放指针for (k = 0; k < A.Cols; k++) //将所有列号处理一遍{for (i = 0; i < A.Terms; i++) //在数组中找到列号为k的三元组{if (A.elem[i].col == k) //第i个三元组中元素列号为k{B.elem[CurrentB].row = k;B.elem[CurrentB].col = A.elem[i].row;B.elem[CurrentB].value = A.elem[i].value;CurrentB++; //存放指针加一}}}}
}void FastTranspos(SparseMatrix &A, SparseMatrix &B) //借助辅助数组的转置
{int *rowSize = (int*)malloc(A.Cols * sizeof(int));int *rowStart = (int*)malloc(A.Cols * sizeof(int));int i, j;B.Rows = A.Cols;B.Cols = A.Rows;B.Terms = A.Terms;if (A.Terms > 0){for (i = 0; i < A.Cols; i++) rowSize[i] = 0; //统计各列非零元素的个数for (i = 0; i < A.Terms; i++) rowSize[A.elem[i].col]++;rowStart[0] = 0; //计算转置后各行开始位置for (i = 1; i < A.Cols; i++) rowStart[i] = rowStart[i - 1] + rowSize[i - 1];for (i = 0; i < A.Terms; i++){j = rowStart[A.elem[i].col];B.elem[j].row = A.elem[i].col;B.elem[j].col = A.elem[i].row;B.elem[j].value = A.elem[i].value;rowStart[A.elem[i].col]++;}}free(rowSize);free(rowStart);
}
/*矩阵的相加 A+B = C */
bool AddMatrix(SparseMatrix &A, SparseMatrix &B, SparseMatrix &C)
{Triple temp; DataType sum;if (A.Rows != B.Rows || A.Cols != B.Cols) return false;C.Rows = A.Rows; C.Cols = A.Cols;int i, j, k;i = j = k = 0;while (i < A.Terms || j < B.Terms){if (k > maxTerms) return false;if (A.elem[i].row < B.elem[j].row)C.elem[k++] = A.elem[i++];else if (A.elem[i] > B.elem[j])C.elem[k++] = B.elem[j++];else{if (A.elem[i].col < B.elem[i])C.elem[k++] = A.elem[i++];else if (A.elem[i] > B.elem[j])C.elem[k++] = B.elem[j++];else{sum = A.elem[i].value + B.elem[j].value;if (sum){temp.row = A.elem[i].row;temp.col = A.elem[j].col;temp.value = sum;C.elem[k++] = temp;}i++; j++; }}}C.Terms = k;
}
/*矩阵的乘法A*B = C */
bool MultiMatix(SparseMatrix &A, SparseMatrix &B, SparseMatrix &C)
{if (A.Cols != B.Rows) return false; //矩阵相乘的条件int i, j, ra, ca, cb, current, k;int *rowSize = (int*)malloc(B.Rows * sizeof(int)); //矩阵B各行非零元素的个数int *rowStart = (int*)malloc((B.Rows + 1) * sizeof(int)); //矩阵B各行的起始位置DataType *temp = (DataType*)malloc(B.Cols * sizeof(DataType)); //存放矩阵C一行的结果for (i = 0; i < B.Rows; i++) rowSize[i] = 0;for (i = 0; i < B.Terms; i++) rowSize[B.elem[i].row]++; //计算非零元素个素rowStart[0] = 0; //计算每行的起始位置for (i = 0; i < B.Terms; i++) rowStart[i] = rowStart[i - 1] + rowSize[i - 1]; current = 0, k = -1; //A的扫描指针,C的结果存放指针while (current < A.Terms) //处理A的每个三元组{for (j = 0; j < B.Cols; j++) temp[j] = 0; //temp初始化ra = A.elem[current].row; while (current < A.Terms && A.elem[current].row == ra) //这个循环用来计算A中当前行, { //与B中各列的结果,一列一个结果,累加存入//temp数组ca = A.elem[current].col; //ca为A中当前行的列号for (i = rowStart[ca]; i < rowStart[ca + 1]; i++) //取B中所有行号为ca的元素 {cb = B.elem[i].col; //B中相乘元素的列号temp[cb] = temp[cb] + A.elem[current].value*B.elem[i].value;} //A[current][ca] 与B[ca][cb]相乘current++;}for (i = 0; i < B.Cols; i++) //将temp中非零元素存入C中{ if ( temp[i] != 0){k++;C.elem[k].col = ra;C.elem[k].col = i;C.elem[k].value = temp[i];}}}C.Rows = A.Rows;C.Cols = B.Cols;C.Terms = k + 1;free(rowSize);free(rowStart);free(temp);
}
稀疏矩阵------三元组存储---笔记相关推荐
- 数据结构 实验14(1-2班):(深入理解索引存储结构)三元组存储的稀疏矩阵建立行列索引并求鞍点
目录 前言: 需求分析: 难点分析: 代码和思路详解: 三元组表的头文件: 建立索引思路: 什么是三元组表的索引: 结合题意实现索引表: 建立索引表的代码实现: 索引表的结构体定义: 索引表的创建思路 ...
- 用三元组存储稀疏矩阵并实现转置
基本概念 在学习线性代数的时候,经常用到矩阵.在C语言中,表示矩阵的最直观形式就是二维数组.然而在实际应用中,很多高阶矩阵中的非零元素非常少,这个时候如果继续使用二维数组存储,那么就会浪费很多存储空间 ...
- 用三元组存储稀疏矩阵及其快速转置
用三元组存储稀疏矩阵及其快速转置 稀疏矩阵的三元组存储方式 快速转置算法 代码 稀疏矩阵的三元组存储方式 稀疏矩阵可以用一个三元组数组表示,数组每个元素是一个三元组,三元组形式为 (矩阵行号,矩阵列号 ...
- 用三元组存储稀疏矩阵,实现其快速转置c语言代码,稀疏矩阵三元组表快速转置(C语言实现)...
本来准备昨天下午写的,但是因为去参加360众测靶场的考核耽搁了,靶场的题目还是挺基础的. 继续学习吧. 使用黑色墨水在白纸上签名就像由像素点构成的稀疏矩阵.如图4所示. 图4手写体签名 [问题]请将以 ...
- c语言三元组稀疏矩阵的转置实验报告,稀疏矩阵三元组实现矩阵转置算法实验报告.doc...
稀疏矩阵三元组实现矩阵转置算法实验报告.doc 1实验三稀疏矩阵的三元组表示实现矩阵转置算法学院专业班学号姓名一.实习目的1掌握稀疏矩阵的三元组顺序表存储表示:2掌握稀疏矩阵三元组表示的传统转置算法的 ...
- 稀疏矩阵三元组 严蔚敏_Sparse稀疏矩阵主要存储格式总结
在数据科学和深度学习等领域会采用矩阵来存储数据,但当矩阵较为庞大且非零元素较少时,运算效率和存储有效率并不高.所以,一般情况我们采用Sparse稀疏矩阵的方式来存储矩阵,来提高存储和运算效率.下面将对 ...
- 5.3矩阵乘积(三元组存储结构)
行逻辑链表的顺序表 为了便于随机存取任意一行的非零元,则需要知道每一行的第一个非零元在三元组表中的位置.为此,可将上节快速转置矩阵中的算法创建的,指示"行"信息的辅助数组cpot固 ...
- 数据结构 稀疏矩阵三元组顺序表 基本操作
[数据结构]稀疏矩阵 三元组顺序表存储 基本操作 1.稀疏矩阵定义: 假设在 mn 的矩阵中,又t个元素不为零.δ = t/mn ,称δ为矩阵的稀疏因子,通常定义δ小于等于0.05时称为稀疏矩阵. 2 ...
- 稀疏矩阵的存储以及转置、加法、乘法操作实现
1.稀疏矩阵的存储与表示 只存储稀疏矩阵中极少数的非零元素,采用一个三元组<row,column,value>来唯一确定一个矩阵元素:因此,稀疏矩阵可用一个三元组数组来表示.另外,还需要存 ...
最新文章
- python减小内存占用_如何将Python内存占用缩小20倍?
- windows使用.NET CORE下创建MVC,发布到linux运行
- c语言中 运算对象必须是整型数的运算符是,在C语言中,运算对象必须是整型数的运算符是...
- 双线路切换-冗余备份实验
- 通过BCS对象模型使用筛选器
- jQuery |添加标签元素/内容
- leetcode844. 比较含退格的字符串
- STL 容器简介:C++ 容器:顺序性容器、关联式容器和容器适配器
- win7系统cocos2dx 3.4 绑定自定义类到Lua
- matlab 直方图 肥尾,概率分布细谈:厚尾、长尾、幂律、指数
- [Python] L1-029. 是不是太胖了-PAT团体程序设计天梯赛GPLT
- 移动端调试工具-Debuggap
- uniapp内使用 mescroll
- pack文件如何安装
- 服务器装系统报0x0000005d,虚拟机安装Win8开机黑屏提示0x0000005D错误如何解决
- 日常开单送货VBA模块
- Python学习笔记--Python 爬虫入门 -17-5 js 加密 (和有道词典的瓜葛)
- Clover引导Windows10,Mac OS High Sierra,CentOS7 经验分享
- 玩安卓从 0 到 1 之总体概览
- beeline执行sql语句_beeline执行sql脚本交易
热门文章
- python使用-使用python进行数据清洗
- python软件下载中文版-PyCharm中文版
- python官网中文官网-Python官方中文文档强势来袭
- 学python能做什么-学完Python可以做什么?
- python安装-在Python中安装包的三种方法
- 普通人学python有意义吗-普通人为什么要学习Python?
- python自学视频教程 38-python编程开发入门中文视频培训教程38讲
- 零基础学python大概要多久-零基础自学python要多久?
- 讯飞输入法将深度神经网络DNN技术应用于语音识别达到业界领先水平
- python直方图解释,请用Python详细解释二维直方图