#include <iostream>
using namespace std;
const int DefaultSize = 100;
typedef int dt;struct Trituple {//三元组int row, col;dt value;/*Trituple& operator=(Trituple& x) {row = x.row, col = x.col, value = x.value;}*/
};
class SparseMatrix {public:friend ostream& operator << (ostream& out, SparseMatrix& x);friend istream& operator >> (istream& in, SparseMatrix& x);SparseMatrix(int maxSize = DefaultSize);SparseMatrix(SparseMatrix& x);~SparseMatrix() { delete[]smArray; }SparseMatrix Transpose();SparseMatrix FastTranspose();SparseMatrix& operator=(SparseMatrix& x);SparseMatrix Add(SparseMatrix& x);SparseMatrix Multiply(SparseMatrix& x);
private:int Rows, Cols, Terms;Trituple* smArray;int maxTerms;
};
SparseMatrix::SparseMatrix(int maxSize):maxTerms(maxSize) {if (maxSize < 1) {cerr << "初始化错误" << endl; exit(1);}smArray = new Trituple[maxSize];if(smArray==NULL) {cerr << "存储分配错误" << endl; exit(1);}Rows = Cols = Terms = 0;
}
SparseMatrix::SparseMatrix(SparseMatrix& x) {Rows = x.Rows; Cols = x.Cols; Terms = x.Terms; maxTerms = x.maxTerms;smArray = new Trituple[maxTerms];if (smArray == NULL) {cerr << "存储分配错误" << endl; exit(1);}for (int i = 0; i < Terms; i++)smArray[i] = x.smArray[i];
}SparseMatrix SparseMatrix::Transpose() {SparseMatrix b(maxTerms);b.Rows = Cols;b.Cols = Rows;b.Terms = Terms;if (Terms) {int k, i, currenntB = 0;for(k=0;k<Cols;k++)for (i = 0; i < Terms; i++)if (smArray[i].col = k) {b.smArray[currenntB].row = k;b.smArray[currenntB].col = smArray[i].row;b.smArray[currenntB++].value = smArray[i].value;}}return b;
}
SparseMatrix SparseMatrix::FastTranspose() {//对稀疏矩阵( * this 指示)做快速转置,结果放在b中并通过函数返回int* rowSize = new int[Cols];//辅助数组,统计各列非零元素个数int* rowStart = new int[Cols];//辅助数组,预计转置后各行存放位置SparseMatrix b(maxTerms); // 1存放转置结果b.Rows = Cols;b.Cols = Rows;b.Terms = Terms;if (Terms > 0) {int i, j;for (i = 0; i < Cols; i++) rowSize[i] = 0;for (i = 0; i < Terms; i++) rowSize[smArray[i].col]++;rowStart[0] = 0;for (i = 1; i < Cols; i++)rowStart[i] = rowStart[i - 1] + rowSize[i - 1];for (i = 0; i < Terms; i++) {//从a向b传送j = rowStart[smArray[i].col]; //第1个非零元素在b中应放位置b.smArray[j].row = smArray[i].col;b.smArray[j].col = smArray[i].row;b.smArray[j].value = smArray[i].value;rowStart[smArray[i].col] ++;}}delete[] rowSize; delete[]rowStart;return b;
}
SparseMatrix& SparseMatrix::operator=(SparseMatrix& x) {Rows = x.Rows; Cols = x.Cols; Terms = x.Terms; maxTerms = x.maxTerms;smArray = new Trituple[maxTerms];if (smArray == NULL) {cerr << "存储分配错误" << endl; exit(1);}for (int i = 0; i < Terms; i++)smArray[i] = x.smArray[i];
}
SparseMatrix SparseMatrix::Add(SparseMatrix& b) {//两个稀疏矩阵A ( * this指示)与B (参数表中的b)相加,结果在Result中SparseMatrix result;result.Rows = Rows;result.Cols = Cols;//结果矩阵的三元组表if (Rows != b.Rows || Cols != b.Cols) {cout << "Incompatible matrices" << endl; //两个 矩阵规格不一样return result;//返回空矩阵}int i = 0, j = 0, index_a, index_b;result.Terms = 0;while (i < Terms && j < b.Terms) {index_a = Cols * smArray[i].row + smArray[i].col;index_b = Cols * b.smArray[j].row + b.smArray[j].col;if (index_a < index_b) {result.smArray[result.Terms] = smArray[i];i++;}else if (index_a > index_b) {result.smArray[result.Terms] = b.smArray[j];j++;}else {result.smArray[result.Terms] = smArray[i];result.smArray[result.Terms].value = smArray[i].value + b.smArray[j].value;i++, j++;}result.Terms++;}//复制剩余元素。for (; i < Terms; i++) {result.smArray[result.Terms] = smArray[i]; result.Terms++;}for (; j < b.Terms; j++) {result.smArray[result.Terms] = b.smArray[i]; result.Terms++;}return result;
}SparseMatrix SparseMatrix::Multiply(SparseMatrix& b) {//两个稀疏矩阵A ( * this指示)与B (参数表中的b)相加,结果在Result中SparseMatrix result;result.Rows = Rows;result.Cols = b.Cols;//结果矩阵的三元组表if (Cols != b.Rows) {cerr << "Incompatible matrices" << endl;//A列数与B行数不等return result;// 返回空矩阵}if (Terms == maxTerms || b.Terms == maxTerms) {cerr << "One additional space inaor b needed" << endl;return result;//空间不足,返回空矩阵}int* rowSize = new int[b.Rows];//矩阵 B各行非零元素个数int* rowStart = new int[b.Rows + 1];//矩阵B各行在三元组开始位置dt* temp = new dt[b.Cols];//暂存每一行计算结果int i, Current, lastInResult, RowA, ColA, ColB;for (i = 0; i < b.Rows; i++) rowSize[i] = 0;for (i = 0; i < b.Terms; i++) rowSize[b.smArray[i].row]++;rowStart[0] = 0;//B第i行非零元素开始位置for (i = 1; i <= b.Rows; i++)rowStart[i] = rowStart[i - 1] + rowSize[i - 1];Current = 0; lastInResult = -1;//a扫描指针及result存指针while (Current < Terms) { //生成result的当前行tempRowA = smArray[Current].row; //当前行的行号for (i = 0; i < b.Cols; i++) temp[i] = 0;while (Current < Terms && smArray[Current].row == RowA) {ColA = smArray[Current].col; //矩阵 A当前扫描到元素的列号for (i = rowStart[ColA]; i < rowStart[ColA + 1]; i++) {ColB = b.smArray[i].col; //矩阵B中相乘元素的列号temp[ColB] += smArray[Current].value * b.smArray[i].value;}}//A的RowA行与B的ColB列相乘Current++;}for (i = 0; i < b.Cols; i++)if (temp[i] != 0) {//将temp中的非零元素压缩到result中去lastInResult++;result.smArray[lastInResult].row = RowA;result.smArray[lastInResult].col = i;result.smArray[lastInResult].value = temp[i];}result.Rows = Rows; result.Cols = b.Cols;result.Terms = lastInResult + 1;delete[]rowSize, delete[]rowStart, delete[]temp;return result;
}ostream& operator<<(ostream& out, SparseMatrix& x) {out << "rows= " << x.Rows<< " cols= " << x.Cols<< " Terms= " << x.Terms << endl;for (int i = 0; i < x.Terms; i++)out << "M[" << x.smArray[i].row << "][" << x.smArray[i].col<< "]= " << x.smArray[i].value << endl;return out;
}
istream& operator>>(istream& in, SparseMatrix& x) {cout << "输入行列和不为零的数字个数" << endl;in >> x.Rows >> x.Cols >> x.Terms;if (x.Terms > x.maxTerms) {cerr << "输入大小错误" << endl; exit(1);}for (int i = 0; i < x.Terms; i++) {cout << "输入行列和该位置数字" << endl;in >> x.smArray[i].row >> x.smArray[i].col >> x.smArray[i].value;}return in;
}
int main(){SparseMatrix sq1,sq2,sq3;cin >> sq1>>sq2;cout << sq1<<sq2<<endl;sq3=sq1.Add(sq2);cout <<sq3<< sq1 << sq2 << endl;sq2.FastTranspose();cout << sq2 << endl;sq3 = sq1.Multiply(sq2);cout <<sq3<< sq1 << sq2 << endl;}

数据结构——三元组实现稀松矩阵相关推荐

  1. 数据结构与算法-三对角矩阵的压缩公式推导

    数据结构与算法-三对角矩阵的压缩公式推导 三对角矩阵 压缩公式推导 (1)考虑a[i,j]处在第2到第n-1行之间: 我们可以看到,从第二行开始,元素的个数都为3个.对于a[i,j]将要存储的数组下标 ...

  2. 数据结构-数组与压缩矩阵

    数组的定义 数组是由n(n>1)个具有相同数据类型的数据元素a1...an组成的有序序列,且该序列必须存储在一块地址连续的存储单元中. 1.数组中的数组元素就有相同的数据类型 2.数组是一种随机 ...

  3. 数据结构三元组实验报告_三元组实验报告.doc

    三元组实验报告 三元组实验报告 实验报告:3元组的实现 一.问题描述 设计一个实现3元组基本操作的C语言程序: 1.实现三元组的构造.取值.修改.有序判断. 最大值.最小值和销毁.打印等基本操作 2. ...

  4. 《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问

        老板让让做一个东东.输入端要用到opencv顺便就来学习一下.买了本书<学习opencv>翻来一看,opencv1.0,去官网上一看.opencv2.49,瞬间有种蛋碎的赶脚.看着 ...

  5. 数据结构实验6_压缩矩阵的转置、普通转置、快速转置算法

    实验6.压缩矩阵的2种转置运算 (1)实验目的 通过该实验,让学生理解矩阵压缩存储的概念.方法等相关知识,掌握用三元组表的方式如何进行矩阵的压缩存储, 并在此基础上进行转置操作,理解转置和快速转置两种 ...

  6. 数据结构C语言实现-矩阵的压缩存储

    一.矩阵的压缩存储: 在编写程序时往往都是二维数组表示矩阵,然而在数值分析中经常出现一些阶数很高的的矩阵同时在距震中有很多值相同的元素,或者是零元素,为了节省空间,可以对这类矩阵进行压缩存储,所谓的压 ...

  7. 数据结构-拓展突破-特殊矩阵(对称矩阵,三角矩阵,三对角矩阵,稀疏矩阵)的压缩存储)

    文章目录 1. 对称矩阵 2. 三角矩阵 3. 三对角矩阵 4. 稀疏矩阵 1. 对称矩阵 对称矩阵的定义: 若n阶方阵中任意一个元素a,都有a(i,j)=a(j,i)则该矩阵为对称矩阵 也就是说对称 ...

  8. 数据结构三元组实验报告_数据结构三元组项目报告

    数据结构项目报告 项目题目:三元组 项目成员: 日期:2012年4月1号 1. 题目与要求 1.1问题提出 详细叙述本项目所要实现的问题是创建一个三元组并且实现一些有关三元组的操作. 1.2 本项目涉 ...

  9. Matlab与数据结构 -- 搜索向量或矩阵中非零元素的位置

    本图文介绍了Matlab中搜索向量或矩阵中非零元素位置的方法.

最新文章

  1. 在Markdown中用mermaid画流程图和ER图
  2. iOS - PassData
  3. 【NLP】机器如何认识文本 ?NLP中的Tokenization方法总结
  4. LeetCode 1922. 统计好数字的数目(快速幂)
  5. Fei Labs:FIP-5提案已通过
  6. 标准RTSP消息的错误代码–转
  7. 如何使用浏览器的F12调试页面?
  8. (hdu 1568) Fibonacci
  9. 自带CA ,sha256 哈希签名,2048 位加密 脚本,通用
  10. 单片机、ARM与DSP对比
  11. AD19原理图的设计流程
  12. 使用FileZilla下载Jason2和Jason3雷达高度计数据
  13. 一个优秀开发者如何才能变得伟大?
  14. 宠物狗网页制作作业 保护动物网页设计模板 简单学生网页设计 静态HTML CSS网站制作成品
  15. 【acwing】104. 货仓选址*(贪心|绝对值不等式)
  16. 文本相似度匹配-task5
  17. UI自动化控制微信发送文件【解决了一个无人回答的难题,Pywin32设置文件到剪切板】
  18. AnyLogic的相关操作第一天
  19. YAHOO 35条前端优化建议
  20. 支持机器学习!LiDAR360点云数据处理分析软件 V2.1发布

热门文章

  1. UICollectionView--九宫格
  2. 要求:根据以上经济业务,为该省财政总预算会计编制有关的会计分录。
  3. ## React《 深入JSX》
  4. python 编译出现SyntaxError: Non-ASCII character ‘\xe8‘ in file in file serverinfo.py on line 4, but no
  5. 【JQuery元素属性】
  6. SpringBoot集成Swagger2生成API接口文档
  7. Yolov5定位VIN码后获取vin的区域并识别
  8. QAbstractTableModel基本使用:表头相关接口
  9. dubboreference注解_dubbo注解式配置
  10. BHuman工具篇:游戏控制器GameController使用说明