代码:
#include <iostream> #include<malloc.h> #include<cstdio> using namespace std; #define M 4 #define N 4 #define MaxSize 100 typedef int ElemType; typedef struct { int r; int c; ElemType d;///元素值 } TupNode; ///三元组定义 typedef struct { int rows; int cols; int nums; TupNode data[MaxSize]; } TSMatrix; ///三元组顺序表定义 void CreatMat(TSMatrix &t,ElemType A[M][N]) { t.rows=M; t.cols=N; t.nums=0; for(int i=0; i<M; i++) for(int j=0; j<N; j++) if(A[i][j]!=0) { t.data[t.nums].r=i; t.data[t.nums].c=j; t.data[t.nums].d=A[i][j]; t.nums++; } } bool Value(TSMatrix &t,ElemType x,int i,int j) { int k=0,k1; if(i>=t.rows||j>=t.cols) return false; while(k<t.nums&&i>t.data[k].r)k++; while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c)k++; if(t.data[k].r==i&&t.data[k].c==j) t.data[k].d=x; else { for(k1=t.nums-1; k1>=k; k1--) { t.data[k1+1].r=t.data[k].r; t.data[k1+1].c=t.data[k].c; t.data[k1+1].d=t.data[k].d; } t.data[k].r=i; t.data[k].c=j; t.data[k].d=x; t.nums++; } return true; } bool Assign(TSMatrix t,ElemType &x,int i,int j) { int k=0; if(i>=t.rows||j>=t.cols) return false; while(k<t.nums&&i>t.data[k].r)k++; while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c)k++; if(t.data[k].r==i&&t.data[k].c==j) x=t.data[k].d; else x=0; return true; } void DispMat(TSMatrix t) { if(t.nums<=0) return ; printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums); printf("\t-----------------\n"); for(int i=0; i<t.nums; i++) printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d); } void TranMat(TSMatrix t,TSMatrix &tb) { int i,j,k=0; tb.rows=t.cols; tb.cols=t.rows; tb.nums=t.nums; if(t.nums!=0) { for(i=0; i<t.cols; i++) for(j=0; j<t.nums; j++) if(t.data[j].c==i) { tb.data[k].r=t.data[j].c; tb.data[k].c=t.data[j].r; tb.data[k].d=t.data[j].d; k++; } } } bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c) { int i=0,j=0,k=0; ElemType v; if(a.rows!=b.rows||a.cols!=b.cols) return false; c.rows=a.rows; c.cols=a.cols; while(i<a.nums&&j<b.nums) { if(a.data[i].r==b.data[j].r)///先控制行相等 { if(a.data[i].c<b.data[j].c) { c.data[k].r=a.data[i].r; c.data[k].c=a.data[i].c; c.data[k].d=a.data[i].d; k++; i++; } else if(a.data[i].c>b.data[j].c) { c.data[k].r=b.data[j].r; c.data[k].c=b.data[j].c; c.data[k].d=b.data[j].d; k++; j++; } else { v=a.data[i].d+b.data[j].d; if(v!=0) { c.data[k].r=a.data[i].r; c.data[k].c=a.data[i].c; c.data[k].d=v; k++; } i++; j++; } } else if(a.data[i].r<b.data[j].r) { c.data[k].r=a.data[i].r; c.data[k].c=a.data[i].c; c.data[k].d=a.data[i].d; k++; i++; } else { c.data[k].r=b.data[j].r; c.data[k].c=b.data[j].c; c.data[k].d=b.data[j].d; k++; j++; } c.nums=k; } return true; } int getvalue(TSMatrix c,int i,int j) { int k=0; while(k<c.nums&&(c.data[k].r!=i||c.data[k].c!=j)) k++; if(k<c.nums) return (c.data[k].d); else return (0); } bool MatMul(TSMatrix a,TSMatrix b,TSMatrix &c) { int i,j,k,p=0; ElemType s; if(a.cols!=b.rows) return false; for(i=0; i<a.rows; i++) for(j=0; j<b.cols; j++) { s=0; for(k=0; k<a.cols; k++) s+=getvalue(a,i,k)*getvalue(b,k,j); if(s!=0) { c.data[p].r=i; c.data[p].c=j; c.data[p].d=s; p++; } } c.rows=a.rows; c.cols=b.cols; c.nums=p; return true; } int main() { ElemType a1[N][N]={{1,0,3,0},{0,1,0,0},{0,0,1,0},{0,0,1,1}}; ElemType b1[M][M]={{3,0,0,0},{0,4,0,0},{0,0,1,0},{0,0,0,2}}; TSMatrix a,b,c; CreatMat(a,a1); CreatMat(b,b1); printf("a的三元组:\n"); DispMat(a); printf("b的三元组:\n"); DispMat(b); printf("a转置为c\n"); TranMat(a,c); printf("c的三元组\n"); DispMat(c); printf("c=a+b\n"); MatAdd(a,b,c); printf("c的三元组:\n"); DispMat(c); printf("c=a*b\n"); MatMul(a,b,c); printf("c的三元组:\n"); DispMat(c); return 0; }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。如果你想了解更多相关内容请查看下面相关链接
我正在计算两大组向量(具有相同特征)之间的余弦相似度。每组向量表示为一个scipy CSR稀疏矩阵a和B。我想计算一个x B^T,它不会稀疏。但是,我只需要跟踪超过某个阈值的值,例如0.8。我正试图用vanilla RDD在Pyspark中实现这一点,目的是使用为scipy CSR矩阵实现的快速向量操作。 A和B的行是标准化的,所以为了计算余弦相似度,我只需要找到A中每一行与B中每一行的点积。A的
在课堂上,我必须为稀疏矩阵编写自己的线性方程求解器。我可以自由地使用任何类型的数据结构为稀疏矩阵,我必须实现几个解决方案,包括共轭梯度。 谢了!
本文向大家介绍C语言实现稀疏矩阵,包括了C语言实现稀疏矩阵的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现稀疏矩阵的具体代码,供大家参考,具体内容如下 效果图: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
在使用numpy的python中,假设我有两个矩阵: 稀疏矩阵 密集的x*y矩阵 现在我想做,它将返回一个密集的矩阵。 但是,我只关心中非零的单元格,这意味着如果我这样做了,对我的应用程序不会有任何影响 <代码>S\u=S*S\u 显然,这将是对操作的浪费,因为我想把在
我正在处理一个非常大的稀疏矩阵乘法(matmul)问题。作为一个例子,让我们说: > A是一个二进制(75 x 200,000)矩阵。它很稀疏,所以我使用csc进行存储。我需要执行以下matmul操作: B=A.转置()*A 输出将是大小为200Kx200K的稀疏对称矩阵。 不幸的是,B存储在我笔记本电脑上的RAM(或“核心”)中会变得太大。另一方面,我很幸运,因为B有一些属性可以解决这个问题。
本文向大家介绍C++ 实现稀疏矩阵的压缩存储的实例,包括了C++ 实现稀疏矩阵的压缩存储的实例的使用技巧和注意事项,需要的朋友参考一下 C++ 实现稀疏矩阵的压缩存储的实例 稀疏矩阵:M*N的矩阵,矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律。 稀疏矩阵的压缩存储:压缩存储值存储极少数的有效数据。使用{row,col,value}三元组存储每一个有效数据,三元组按原矩阵中的位置