- 浏览: 768639 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
矩阵:是一个具有m行n列的二维数组。
上三角矩阵:只存储对角线及对角线(左上角到右下角)以上的元素。反之则称为下三角矩阵。
稀疏矩阵:非0元素远远小于0元素个数,而且这些元素没有规律
矩阵转置:把原矩阵的行,列对换,在原矩阵中[i][j]位置中的元素,交换到转置矩阵中[j][i]的位置上
SparseMatrix.h
上三角矩阵:只存储对角线及对角线(左上角到右下角)以上的元素。反之则称为下三角矩阵。
稀疏矩阵:非0元素远远小于0元素个数,而且这些元素没有规律
矩阵转置:把原矩阵的行,列对换,在原矩阵中[i][j]位置中的元素,交换到转置矩阵中[j][i]的位置上
SparseMatrix.h
#include<iostream> #include<stdlib.h> #include<cassert> using namespace std; const int DefaultSize = 100; template<class T> class Trituple{ public: int row,col; T val;//非0元素值 Trituple<T> &operator=(Trituple<T>& x){ row = x.row; col = x.col; val = x.val; } }; template<class T> class SparseMatrix{ friend ostream& operator<<(ostream& out,SparseMatrix<T>& M){ out << "Rows:" << M.Rows << endl; out << "Cols:" << M.Cols << endl; out << "Terms:" << M.Terms << endl; for(int i=0;i<M.Terms;++i){ out << "M[" << M.smArray[i].row << "," << M.smArray[i].col << "]:" << M.smArray[i].val << endl; } return out; } friend istream& operator>>(istream& in,SparseMatrix<T>& M){ cout << "Enter number of rows,columns,and terms" << endl; in >> M.Rows >> M.Cols >> M.Terms; if(M.Terms>M.maxTerms){ cerr << "Number of terms overflow!" << endl; exit(1); } for(int i=0;i<M.Terms;++i){ cout << "Enter rows,columns and value of term:" << i+1 << endl; in >> M.smArray[i].row >> M.smArray[i].col >> M.smArray[i].val; } return in; } public: SparseMatrix(int maxSz=DefaultSize); SparseMatrix(SparseMatrix<T>& x); ~SparseMatrix(){delete[] smArray;} SparseMatrix<T>& operator=(SparseMatrix<T>& x); SparseMatrix<T> Transpose(); SparseMatrix<T> Add(SparseMatrix<T>& b); SparseMatrix<T> Multiply(SparseMatrix<T>& b); private: int Rows,Cols,Terms;//非0元素个数 Trituple<T> *smArray; int maxTerms; }; template<typename T> SparseMatrix<T>::SparseMatrix(int maxSz):maxTerms(maxSz) { if(maxSz<1){ cerr << "invalid size" << endl; exit(1); } smArray = new Trituple<T>[maxSz]; assert(smArray!=NULL); Rows = Cols = Terms = 0; } template<typename T> SparseMatrix<T>::SparseMatrix(SparseMatrix<T> &x) { Rows = x.Rows; Cols = x.Cols; Terms = x.Terms; maxTerms = x.maxTerms; smArray = new Trituple<T>[maxTerms]; assert(smArray!=NULL); for(int i=0;i<maxTerms;++i){ smArray[i] = x.smArray[i]; } } /* 返回一个新的矩阵,它是原矩阵的转置 */ template<typename T> SparseMatrix<T> SparseMatrix<T>::Transpose() { SparseMatrix b(maxTerms);//转置矩阵的三元组表 b.Rows = Cols; b.Cols = Rows; b.Terms = Terms; if(Terms>0) { int currentB = 0; for(int i=0;i<Cols;++i)//按列优先顺序依次存放 { for(int t=0;t<Terms;++t) { if(smArray[t].col==i) { b.smArray[currentB].col = smArray[t].row; b.smArray[currentB].row = smArray[t].col; b.smArray[currentB].val = smArray[t].val; currentB++; } } } } } /* 前提条件是:两矩阵的大小相同,行数和列数分别对应相等 */ template<typename T> SparseMatrix<T> SparseMatrix<T>::Add(SparseMatrix<T> &b) { SparseMatrix<T> result(maxTerms); if(Rows!=b.Rows||Cols!=b.Cols){ cerr << "can not add" << endl; return result; } int termA = Terms,termB = b.Terms,indexA,indexB; int i=0,j=0,k=0; //O(Terms+b.Terms)比直接两个for循环O(Terms*b.Terms)要好 while(i<termA||j<termB){ //计算位置 indexA = Cols*smArray[i].row+smArray[i].col; indexB = Cols*b.smArray[i].row+b.smArray[i].col; if(indexA>indexB){ result.smArray[k]=b.smArray[j]; j++; } if(indexA<indexB){ result.smArray[k]=smArray[i]; i++; } if(indexA==indexB){ result.smArray[k].col = smArray[i].col; result.smArray[k].row = smArray[i].row; result.smArray[k].val = smArray[i].val+b.smArray[j].val; i++; j++; } k++; } while(i<termA){ result.smArray[k] = smArray[i]; i++; k++; } while(j<termB){ result.smArray[k] = b.smArray[j]; j++; k++; } result.Terms = k; return result; } /* 前提条件是:A的列数=B的行数 */ template<typename T> SparseMatrix<T> SparseMatrix<T>::Multiply(SparseMatrix<T> &b) { SparseMatrix<T> result(Rows*b.Cols); if(Cols!=b.Rows){ cerr << "can not multiply" << endl; return result; } if(Terms==maxTerms||b.Terms==maxTerms){ cerr << "One additional space is a or b needed" << endl; return result; } int *rowSize = new int[b.Rows]; int *rowStart = new int[b.Rows+1]; T *temp = new T[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; for(i=1;i<=b.Rows;i++) rowStart[i] = rowStart[i-1]+rowSize[i-1]; Current = 0; lastInResult = -1; while(Current<Terms){ RowA = smArray[Current].row; for(i=0;i<b.Cols;i++) temp[i]=0; while(Current<Terms&&smArray[Current].row==RowA){ ColA = smArray[Current].col; for(i=rowStart[ColA];i<rowStart[ColA+1];i++){ ColB = b.smArray[i].col; temp[ColB] += smArray[Current].val*b.smArray[i].val; } Current++; } } for(i=0;i<b.Cols;i++){ if(temp[i]!=0){ lastInResult++; result.smArray[lastInResult].row = RowA; result.smArray[lastInResult].col = i; result.smArray[lastInResult].val = temp[i]; } } result.Rows = Rows; result.Cols = Cols; result.Terms = lastInResult+1; delete[] rowSize; delete[] rowStart; delete[] temp; return result; }
发表评论
-
时间复杂度推导
2012-06-05 22:57 9821.用常数1取代运行时间中的所有加法常数 2.在修改后的运行次 ... -
数据结构概论2
2012-06-04 22:19 808数据元素:组成数据的,有一定意义的基本单位,在计算机中通常作为 ... -
排序概念
2011-06-24 14:51 788数据表:待排序数据元素的有很集合 排序码:通常数据元素有多个 ... -
图的基本概念
2011-06-20 16:18 749完全图:n个顶点,n*(n-1)/2个边的无向图,就是无向完全 ... -
红黑树
2011-06-16 14:29 515红黑树: 1.根结点和所有的叶结点都是黑色 2.从根结点到叶结 ... -
链表反转
2011-06-12 18:03 1101template<typename T> v ... -
散列表(哈希表)
2011-06-09 09:55 1081散列表(hash table):是表示集合和字典的另一种有效方 ... -
跳 表
2011-06-08 11:12 804#ifndef SKIPLIST_H #define S ... -
字 典
2011-06-08 10:06 925字典:以集合为基础,并支持支持Member,Insert和Re ... -
LinkedSet
2011-06-07 13:08 924改了很久的bug #ifndef LINKEDSET_H ... -
bitset
2011-06-06 12:27 885bitSet.h #ifndef BITSET_H #d ... -
Huffman树
2011-06-02 11:06 917Huffman树,又称最优二叉树,是一类加权路径长度最短的二叉 ... -
堆
2011-06-02 09:19 952在优先级队列的各种实现中,堆是最高效的一种数据结构 关键码: ... -
森 林
2011-06-01 11:09 602森林与二叉树互转,主要是子结点转左子树,兄弟结点转右子树 深 ... -
二叉树的链式实现
2011-05-31 11:24 1264binaryTree.h #ifndef LINKEDBI ... -
二叉树基本概念
2011-05-30 10:05 844一棵二叉树的结点的一个有限集合:该集合或者为空,或者是由一个根 ... -
树基本概念
2011-05-30 09:28 893结点(node):包含数据项及指向其他结点的分支。 结点的度( ... -
广义表
2011-05-27 10:57 936广义表的定义是递归的,因为在表的描述中又用到了表,允许表中有表 ... -
优先级队列
2011-05-21 11:24 602PQueue.h #ifndef PQUEUE_H #d ... -
链式队列
2011-05-20 12:05 828LinkedQueue.h #ifndef LINKEDQ ...
相关推荐
Matlab 矩阵相关函数 Matlab 矩阵相关函数是 Matlab 编程语言中的一组强大且灵活的矩阵操作工具,用于矩阵对角线元素的抽取、上三角阵和下三角阵的抽取、矩阵的变维、矩阵分解、线性方程的组的求解、秩与线性相关性...
"矩阵相关计算的类"是编程中的一个工具,它允许开发者通过对象化的形式来处理和操作矩阵,从而简化复杂的线性运算。 矩阵是一种二维数组,用大写字母表示,如A、B等。它由行和列组成,每个元素都被称为矩阵的元素或...
在这个场景中,"xg_spearman相关性_矩阵_矩阵相关系数_"的标题指的是使用Spearman相关系数来分析矩阵中的列之间的关系。 Spearman相关系数,通常表示为ρ(rho),是一种评估两个排名变量之间关系强度和方向的指标...
10. **鳞状因子循环矩阵方程解的条件与求解的快速算法**:鳞状因子矩阵与循环矩阵相关,解此类矩阵方程时,快速算法可以改善求解的效率。这些算法可能涉及到预处理步骤以简化问题,从而加快求解速度。 这些论文共同...
矩阵求逆包含相关运算
这是一个矩阵相关运算的代码,包括了求矩阵的加减,乘积,逆,行列式等的python代码。
在IT领域,尤其是在数据分析和机器学习中,"相关系数"和"矩阵相关"是至关重要的概念。本项目涉及的文件提供了处理这些概念的程序代码,包括读取和写入文件、矩阵规范化以及计算相关系数矩阵的功能。以下是这些知识点...
介绍矩阵相关知识
在实际应用中,理解和掌握如何高效求解Toeplitz矩阵相关的线性方程组和逆矩阵,对于优化信号处理算法、加速数值计算和提高数据分析效率至关重要。例如,在数字信号处理中,Toeplitz矩阵常常出现在滤波器设计、谱分析...
在探讨Excel在矩阵相关计算中的应用时,首先需要了解矩阵是什么,以及它们在数学和工程学领域中被如何应用。矩阵是数字的矩形排列,可以表示线性方程组、进行线性变换等操作,是数学分析、工程学、物理学和计算机...
矩阵的运算可运用在多个领域,诸如:线性系统,图像处理,机器学习等,本文档主要用C语言来实现矩阵相关的操作。
文件列表中的"iSolver"可能是指一种求解器或者与求解刚度矩阵有关的工具或脚本。在Python中,可以使用如SLEPc、PETSc等科学计算库来求解大规模线性和非线性问题,包括求解刚度矩阵对应的线性系统。 总结来说,这个...
在MATLAB中,矩阵是其核心操作对象,因此掌握矩阵相关的命令对于高效使用MATLAB至关重要。以下是一些MATLAB中常用的矩阵命令及其详细说明: 1. `size(a)`:这个命令用于获取矩阵`a`的尺寸。对于二维矩阵,它会返回...
6. **矩阵相关性分析**: 这个过程涉及计算矩阵的相关系数矩阵,然后可能包括主成分分析(PCA)、因子分析或其他降维技术,以便更好地理解矩阵元素间的关系。相关性分析有助于识别潜在的结构和模式,这对于数据挖掘和...
MATLAB矩阵相关.docx
MATLAB矩阵相关.pdf
此文件可能扩展了汉克尔矩阵的构造,比如添加了矩阵的加法操作,或者实现了其他与汉克尔矩阵相关的算法,如奇异值分解(SVD)或谱分析。这有助于对矩阵进行进一步的分析,如识别系统的频率特性或稳定性。 6. 应用...
在ANSYS这一强大的有限元分析软件中,刚度矩阵是一个至关重要的概念,它在结构静力学分析、动力学分析及优化设计等多个领域中扮演着核心角色。本文将深入探讨ANSYS中的刚度矩阵,包括其定义、计算方法、以及如何在...
### 和矩阵相关的头文件matrix.h知识点解析 #### 文件概述 `matrix.h` 是一个自定义的C++头文件,用于实现基本的矩阵操作。当在C++程序开发过程中遇到“找不到 matrix.h”这类错误时,可以通过创建并填充该头文件来...
在编程领域,矩阵运算是一种常见的计算任务,尤其在科学计算、图像处理、机器学习等领域有着广泛的应用。本项目是基于C语言实现的矩阵运算程序,包括矩阵的加法、乘法以及求逆等基础操作,并且特别涉及了卡尔曼滤波...