稀疏矩阵
三元组的表示
(1)、目的:对于在实际问题中出现的大型的稀疏矩阵,若用常规分配方法在计算机中储存,将会产生大量的内存浪费,而且在访问和操作的时候也会造成大量时间上的浪费,为了解决这一问题,从而善生了多种解决方案。
(2)、由于其自身的稀疏特性,通过压缩可以大大节省稀疏矩阵的内存代价。具体操作是:将非零元素所在的行、列以及它的值构成一个三元组(i,j,v),然后再按某种规律存储这些三元组,这种方法可以节约存储空间。
具体如下图:
#define SMAX 1000 typedef struct { int i,j; //储存非零元素的行和列信息 datatype v; //非零元素的值 }SPNode; //定义三元组类型 typedef struct { int mu,nu,tu; //矩阵的行、列和非零元素的个数 SPNode data[SMAX]; //三元组表 }SPMatrix;
稀疏矩阵的转置
操作:一个n*m的稀疏矩阵转置后得到的将是一个m*n的矩阵。简单来说就是讲三元组中的行标和列标交换,但是仅仅是这样就结束了么? 当然不是。前面规定三元组的是按一行一行且每行中的元素是按列号从小到大的规律顺序存放的,因此B 也必须按此规律实现。
=》
算法思路:
①A 的行、列转化成B 的列、行;
②在A.data 中依次找第一列的、第二列的、直到最后一列,并将找到的每个三元组的行、列交换后顺序存储到B.data 中即可。
由于对于A的转置是自上而下的,也就要求对于A中任意元素的转置后位置必须是可知的,而原储存顺序是按行号排列的,所以转置前同列的在前面的转置后一定还在同行的前方。故确定了转置后的每行的第一个元素的位置即确定整个顺序。具体计算如下图
代码如下:
void TransM1 (SPMatrix *A) { SPMatrix *B; int p,q,col; B=malloc(sizeof(SPMatrix)); /*申请存储空间*/ B->mu=A->nu; B->nu=A->mu; B->tu=A->tu; /*稀疏矩阵的行、列、元素个数*/ if (B->tu != 0) /*有非零元素则转换*/ { q=0; for (col=1; col<=(A->nu); col++) { /*按A 的列序转换*/ for (p=1; p<= (A->tu); p++) /*扫描整个三元组表*/ if (A->data[p].j==col ) { B->data[q].i= A->data[p].j ; B->data[q].j= A->data[p].i ; B->data[q].v= A->data[p].v; q++; }/*if*/ } } /*if(B->tu>0)*/ return B; /*返回的是转置矩阵的指针*/ } /*TransM1*/
相关阅读
转载 2015年11月07日 10:51:57标签:压缩感知 /SRC目前已有很多方法和技术用于构造分类模型,如决策树、神经网络、贝叶斯方法、Fis
相关矩阵也叫相关系数矩阵,是由矩阵各列间的相关系数构成的。也就是说,相关矩阵第i行第j列的元素是原矩阵第i列和第j列的相关系数。
雅可比矩阵:一个多元函数的一阶偏导数以一定方式排列成的矩阵黑塞矩阵:一个多元函数的二阶偏导数以一定方式排列成的矩阵雅可比矩阵
axis off;% 去掉坐标轴 axistight;% 紧坐标轴 axisequal;% 等比坐标轴 axis([-0.1, 8.1, -1.1, 1.1]);% 坐标轴的显示范围 % gca
Eigen库 矩阵基本操作:转置矩阵,逆矩阵,伴随矩阵,特征值
#include <iostream>#include "Eigen\Dense"using namespace Eigen;using namespace std;int main(){ Matrix3d Mat1; M