矩阵转置+矩阵相加(三元组)
来源:互联网 发布:淘宝金牌卖家在哪 编辑:程序博客网 时间:2024/04/28 03:42
稀疏矩阵
如果在矩阵中,多数的元素为0,通常认为非零元素比上矩阵所有元素的值小于等于0.05时,则称此矩阵为稀疏矩阵(sparse matrix)。
- 基本结构
//---------稀疏矩阵基本结构----------typedef struct{ int i, j; ElemType elem;}Triple;typedef struct{ Triple data[MaxSize]; int mu,nu,tu;}TSMatrix;
- 矩阵转置O(n²)
//矩阵转置O(n²)void TransposeMatrix1(TSMatrix M,TSMatrix *T){ int p, q, col; T->mu = M.mu, T->nu = M.nu, T->tu = M.tu; if(T->tu > 0) //非空矩阵 { q = 0; for(col = 0; col < T->nu; col++) //枚举每一个列 for(p = 0; p < T->tu; p++) //尝试每一个元素,判断是否为该列 if(M.data[p].j == col) //行列互换 { T->data[q].i = M.data[p].j; T->data[q].j = M.data[p].i; T->data[q].elem = M.data[p].elem; q++; } }}
- 举证转置O(n)
原理:如果能预先确定矩阵M中每一列(即T中的每一行)的第一个非零元素在T中的合适位置,那么在对M进行转置时就可以直接放到T中的恰当位置上去。为了确定这些位置,应先求得M的每一列中非零元的个数,进而求得每一列的第一个非零元在T中的位置。
设num[]和cpot[]分别用来存放每一列的非零元的个数和该列第一个非零元在转置后矩阵T中的位置。则显然有:
cpot[0]= 0;
cpot[col] = cpot[col-1]+num[col-1] 0<=col<M.nu
而每一列的非零元的个数可以通过对整个矩阵M扫描一遍得到。
//举证转置O(n)void TransposeMatrix2(TSMatrix M, TSMatrix *T){ T->mu = M.mu, T->nu = M.nu, T->tu = M.tu; int num[1000], cpot[1000], p; if(T->tu > 0) { for(p = 0; p < M.tu; p++) //初始化每一列的非零元的个数num num[p] = 0, cpot[p] = 0; //该列第一个非零元在转置后矩阵T中的位置cpot for(p = 0; p < M.tu; p++) //统计每列的非零元个数 num[M.data[p].j]++; for(p = 1; p < M.tu; p++) //计算每列第一个非零元转置后的位置 cpot[p] = cpot[p-1]+num[p-1]; for(int q = 0; q < M.tu; q++) { int t = M.data[q].j; int p = cpot[t]; T->data[p].i = M.data[q].j; T->data[p].j = M.data[q].i; T->data[p].elem = M.data[q].elem; cpot[t]++; //该列的下个元素放在下一个位子 } }}
- 矩阵加法
int cmp(Triple m1, Triple m2){ if(m1.i == m2.i) { if(m1.j == m2.j) return 0; else if(m1.j < m2.j) return -1; else return 1; } else if(m1.i < m2.i) return -1; else return 1;}void MatrixAdd(TSMatrix *m1, TSMatrix *m2, TSMatrix *m3){ int p = 0, q = 0; int k = 0; while(p < m1->tu && q < m2->tu) //思路同归并 { if(cmp(m1->data[p], m2->data[q]) == -1) { m3->data[k].i = m1->data[p].i; m3->data[k].j = m1->data[p].j; m3->data[k].elem = m1->data[p].elem; k++; p++; } else if(cmp(m1->data[p], m2->data[q]) == 1) { m3->data[k].i = m2->data[q].i; m3->data[k].j = m2->data[q].j; m3->data[k].elem = m2->data[q].elem; k++; q++; } else { m3->data[k].i = m2->data[q].i; m3->data[k].j = m2->data[q].j; m3->data[k].elem = m1->data[p].elem+m2->data[q].elem; k++; q++, p++; } } while(p < m1->tu) { m3->data[k].i = m1->data[p].i; m3->data[k].j = m1->data[p].j; m3->data[k].elem = m1->data[p].elem; k++; p++; } while(q < m2->tu) { m3->data[k].i = m2->data[q].i; m3->data[k].j = m2->data[q].j; m3->data[k].elem = m2->data[q].elem; k++; q++; } m3->tu = k;}
0 0
- 矩阵转置+矩阵相加(三元组)
- 三元组矩阵转置
- 稀疏矩阵的三元组表示的实现及应用(矩阵相加)
- 三元组表示矩阵,以及稀疏矩阵的转置
- 三元组实现矩阵转置.cpp
- 二维矩阵转三元组(稀疏矩阵)
- 稀疏矩阵的三元组表示的实现及应用(2)——采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法
- 稀疏矩阵三元组的相加相乘运算
- 三元组(稀疏矩阵的转置)
- 矩阵相乘(三元组)
- 第九周 项目3 稀疏矩阵的三元组表示的实现及应用(矩阵相加)
- 矩阵相加的算法(存储结构为三元组表)
- Sparse Matrix(稀疏矩阵三元组表示,三元组形式的矩阵转置)
- 利用稀疏矩阵的“三元组表”存储结构,实现两个矩阵的相加。
- 稀疏矩阵-三元组
- 三元组稀疏矩阵的快速转置
- 用三元组存储稀疏矩阵并实现转置
- 稀疏矩阵基于“三元组”的转置算法实现
- FastDFS启动少了8888和8080http端口的进程
- RNNs
- 前端不错的解决方案 ----转自大神张云龙@@@@
- Action Recognition with Trajectory-Pooled Deep-Convolutional Descriptors
- 几种访问谷歌的方法
- 矩阵转置+矩阵相加(三元组)
- echarts 动态数据交互实例
- RHCE 学习笔记(9) 网络管理
- 无法访问 IIS 元数据库。您没有足够的特权访问计算机上的 IIS 网站。
- VS2013 无法使用'inet_ntoa': Use inet_ntop() or InetNtop() instead or define
- ubuntu下使用hexo搭建博客
- timeout
- ios应用版本号设置规则
- 2015 AppStore 最新审核指南