永发信息网

稀疏矩阵与压缩感知应该如何理解

答案:2  悬赏:0  手机版
解决时间 2021-02-27 01:29
  • 提问者网友:难遇难求
  • 2021-02-26 01:50
稀疏矩阵与压缩感知应该如何理解
最佳答案
  • 五星知识达人网友:撞了怀
  • 2021-02-26 02:51
压缩感知就是压缩,进行压缩的对象是稀疏矩阵。
全部回答
  • 1楼网友:神鬼未生
  • 2021-02-26 04:15
我给你源码记得顶我啊!!最主要的是把分给我哦!! include<time.h> #include<stdio.h> #include<stdlib.h> #define max_array_dim 2 #define maxsize 100 typedef struct { int aa[max_array_dim]; int dim; int *base; }array; typedef struct { int i,j; int e; }triple; typedef struct { triple data[maxsize]; int *rpos; int mu,nu,tu; }tsmatrix; main() { void initarray(array *a); void createsmatrix(array *a); void inittsmatrix(array *a,tsmatrix *m); void outputtsmatrix(tsmatrix *m); void destroysmatrix(array *a); void outputarray(array *a); void subtmatrix(tsmatrix *m,tsmatrix *n,tsmatrix *q); void addsmatrix(tsmatrix *m,tsmatrix *n,tsmatrix *q); void multsmatrix(tsmatrix *m,tsmatrix *n,tsmatrix *q); array a; tsmatrix m,n,q; int flag1=1,i; srand((unsigned)time(null)); initarray(&a); createsmatrix(&a); inittsmatrix(&a,&m); outputtsmatrix(&m); outputarray(&a); destroysmatrix(&a); initarray(&a); createsmatrix(&a); inittsmatrix(&a,&n); outputtsmatrix(&n); outputarray(&a); destroysmatrix(&a); printf("2个三元数组已经创建成功,您要进行什么操作?\n1.(m+n)\n2.(m-n)\n3.(m*n)\n4.(n-m)\n"); while(flag1) { fflush(stdin); scanf("%d",&i); switch(i) { case 1:addsmatrix(&m,&n,&q);flag1=0;break; case 2:subtmatrix(&m,&n,&q);flag1=0;break; case 3:multsmatrix(&m,&n,&q);flag1=0;break; case 4:subtmatrix(&n,&m,&q);flag1=0;break; default:printf("输入错误请重新输入\n您要进行什么操作?1.(m+n)\n2.(m-n)\n3.(m*n)\n4.(n-m)\n\n"); } } printf("运算结果为\n"); outputtsmatrix(&q); } void initarray(array *a) { int i,j; printf("请输入要创建的维数,(由于这里的作用是创建稀疏矩阵,建议输入2)\n"); scanf("%d",&a->dim); if(a->dim!=max_array_dim) { printf("输入维数超过界限\n"); exit(1); } for(i=0;i<a->dim;i++) { printf("请输入第%d维的数据",i+1); scanf("%d",&a->aa[i]); if(a->aa[i]<1) { printf("输入超过范围\n"); exit(1); } } j=1; for(i=0;i<a->dim;i++) j*=a->aa[i]; if(!(a->base=(int *)malloc(j*sizeof(int)))) { printf("开辟空间失败\n"); exit(1); } printf("数组创建成功\n"); } void createsmatrix(array *a) { int i,j,k,l,m,n,flag1; printf("是手动输入还是电脑自行创建?\n选1.电脑自行创建\n选0.手动创建\n"); scanf("%d",&i); if(i!=1&&i!=0) { printf("输入格式错误\n"); exit(1); } if(i==0) { printf("请输入\n"); for(j=0;j<a->aa[0];j++) { for(k=0;k<a->aa[1];k++) scanf("%d",&a->base[j*a->aa[1]+k]); printf("\n"); } } else { l=rand()%(a->aa[0]*a->aa[1]/4)+1; for(j=0;j<a->aa[0];j++) for(k=0;k<a->aa[1];k++) a->base[j*a->aa[1]+k]=0; m=0; while(m<l) { flag1=1; while(flag1) { i=rand()%a->aa[0]; j=rand()%a->aa[1]; if(a->base[i*a->aa[1]+j]==0) flag1=0; } flag1=1; a->base[i*a->aa[1]+j]=rand()%10; n=rand()%10; if(n<5) a->base[i*a->aa[1]+j]*=-1; m++; } } } void inittsmatrix(array *a,tsmatrix *m) { int i,j,k=0,*num; for(i=0;i<a->aa[0];i++) for(j=0;j<a->aa[1];j++) if(a->base[i*a->aa[1]+j]!=0) { m->data[k+1].i=i+1; m->data[k+1].j=j+1; m->data[k+1].e=a->base[i*a->aa[1]+j]; k++; } m->mu=a->aa[0]; m->nu=a->aa[1]; m->tu=k; if(!(num=(int *)malloc((m->mu+1)*sizeof(int)))) { printf("空间开辟失败\n"); exit(1); } if(!(m->rpos=(int *)malloc((m->mu+1)*sizeof(int)))) { printf("空间开辟失败\n"); exit(1); } for(i=0;i<=m->mu;i++) num[i]=0; for(i=1;i<=m->tu;i++) ++num[m->data[i].i]; if(num[1]==0) { m->rpos[1]=0; j=0; } else { m->rpos[1]=1; j=num[1]; } for(i=2;i<=m->mu;i++) { if(num[i]==0) m->rpos[i]=0; else { m->rpos[i]=j+1; j+=num[i]; } if(j>=m->tu) break; } while(i<=m->mu) i++,m->rpos[i]=0; } void outputtsmatrix(tsmatrix *m) { int i; printf("三元组表为\n"); for(i=1;i<=m->tu;i++) printf("%d行 %d列 %d\n",m->data[i].i,m->data[i].j,m->data[i].e); printf("行为%d列为%d\n",m->mu,m->nu); for(i=1;i<=m->mu;i++) printf("%d行的第一个元素所在位置表的位置是%d\n",i,m->rpos[i]); } void destroysmatrix(array *a) { if(!a->base)exit(1); free(a->base);a->base=null; printf("\n稀疏矩阵数组销毁成功(*^__^*) \n\n"); } void outputarray(array *a) { int i,j; for(i=0;i<a->aa[0];i++) { for(j=0;j<a->aa[1];j++) printf("%2d ",a->base[i*a->aa[1]+j]); printf("\n"); } } void copysmatrix(tsmatrix *m,tsmatrix *t) { int i; t->mu=m->mu,t->nu=m->nu,t->tu=m->tu; if(!(t->rpos=(int *)malloc((t->mu+1)*sizeof(int)))) { printf("开辟控件失败\n"); exit(1); } if(t->tu) { for(i=1;i<=m->tu;i++) { t->data[i].i=m->data[i].i; t->data[i].j=m->data[i].j; t->data[i].e=m->data[i].e; } } for(i=1;i<=t->mu;i++) t->rpos[i]=m->rpos[i]; } void subtmatrix(tsmatrix *m,tsmatrix *n,tsmatrix *q) { int i,j,k,a,b,c,x,y,z,*num; q->mu=m->mu>n->mu?m->mu:n->mu; q->nu=m->nu>n->nu?m->nu:n->nu; q->tu=0; if(!(num=(int *)malloc((q->mu+1)*sizeof(int)))) { printf("创建空间失败\n"); exit(1); } if(!(q->rpos=(int *)malloc((q->mu+1)*sizeof(int)))) { printf("创建空间失败\n"); exit(1); } for(i=1;i<=q->mu;i++) num[i]=0; if(m->tu==0) copysmatrix(n,q); else if(n->tu==0) copysmatrix(m,q); else { i=j=k=1; while(i<=m->tu&&j<=n->tu) { a=m->data[i].i; b=m->data[i].j; c=m->data[i].e; x=n->data[j].i; y=n->data[j].j; z=n->data[j].e; if(a==x) { if(b==y) { if(c-z!=0) { num[a]++; q->data[k].i=a; q->data[k].j=b; q->data[k].e=c-z; k++; } i++,j++; } else if(b<y) { num[a]++; q->data[k].i=a; q->data[k].j=b; q->data[k].e=c; k++; i++; } else if(b>y) { num[x]++; q->data[k].i=x; q->data[k].j=y; q->data[k].e=-z; k++;j++; } else printf("不可能出现的事情\n"); } else if(a>x) { num[x]++; q->data[k].i=x; q->data[k].j=y; q->data[k].e=-z; k++;j++; } else if(a<x) { num[a]++; q->data[k].i=a; q->data[k].j=b; q->data[k].e=c; k++;i++; } else printf("不可能发生的事情\n"); } if(i>m->tu&&j<=n->tu) { while(j<=n->tu) { num[n->data[j].i]++; q->data[k].i=n->data[j].i; q->data[k].j=n->data[j].j; q->data[k++].e=-n->data[j++].e; } } else if(j>n->tu&&i<=m->tu) { while(i<=m->tu) { n->data[m->data[i].i].i; q->data[k].i=m->data[i].i; q->data[k].j=m->data[i].j; q->data[k++].e=m->data[i++].e; } } q->tu=k-1; if(num[1]==0) { q->rpos[1]=0; j=0; } else { q->rpos[1]=1; j=num[1]; } for(i=2;i<=q->mu;i++) { if(num[i]==0) q->rpos[i]=0; else { q->rpos[i]=j+1; j+=num[i]; } if(j>=q->tu) break; } while(i<=q->mu) { i++; q->rpos[i]=0; } } } void addsmatrix(tsmatrix *m,tsmatrix *n,tsmatrix *q) { int i,j,k,a,b,c,x,y,z,*num; q->mu=m->mu>n->mu?m->mu:n->mu; q->nu=m->nu>n->nu?m->nu:n->nu; q->tu=0; if(!(num=(int *)malloc((q->mu+1)*sizeof(int)))) { printf("创建空间失败\n"); exit(1); } if(!(q->rpos=(int *)malloc((q->mu+1)*sizeof(int)))) { printf("创建空间失败\n"); exit(1); } for(i=1;i<=q->mu;i++) num[i]=0; if(m->tu==0) copysmatrix(n,q); else if(n->tu==0) copysmatrix(m,q); else { i=j=k=1; while(i<=m->tu&&j<=n->tu) { a=m->data[i].i; b=m->data[i].j; c=m->data[i].e; x=n->data[j].i; y=n->data[j].j; z=n->data[j].e; if(a==x) { if(b==y) { if(c+z!=0) { num[a]++; q->data[k].i=a; q->data[k].j=b; q->data[k].e=c+z; k++; } i++,j++; } else if(b<y) { num[a]++; q->data[k].i=a; q->data[k].j=b; q->data[k].e=c; k++; i++; } else if(b>y) { num[x]++; q->data[k].i=x; q->data[k].j=y; q->data[k].e=z; k++;j++; } else printf("不可能出现的事情\n"); } else if(a>x) { num[x]++; q->data[k].i=x; q->data[k].j=y; q->data[k].e=z; k++;j++; } else if(a<x) { num[a]++; q->data[k].i=a; q->data[k].j=b; q->data[k].e=c; k++;i++; } else printf("不可能发生的事情\n"); } if(i>m->tu&&j<=n->tu) { while(j<=n->tu) { num[n->data[j].i]++; q->data[k].i=n->data[j].i; q->data[k].j=n->data[j].j; q->data[k++].e=n->data[j++].e; } } else if(j>n->tu&&i<=m->tu) { while(i<=m->tu) { n->data[m->data[i].i].i; q->data[k].i=m->data[i].i; q->data[k].j=m->data[i].j; q->data[k++].e=m->data[i++].e; } } q->tu=k-1; if(num[1]==0) { q->rpos[1]=0; j=0; } else { q->rpos[1]=1; j=num[1]; } for(i=2;i<=q->mu;i++) { if(num[i]==0) q->rpos[i]=0; else { q->rpos[i]=j+1; j+=num[i]; } if(j>=q->tu) break; } while(i<=q->mu) { i++; q->rpos[i]=0; } } } void multsmatrix(tsmatrix *m,tsmatrix *n,tsmatrix *q) { int i,j,k,l,o,p,x,y,*a,*num; if(!(a=(int *)malloc(((m->mu+1)*(n->nu+1))*sizeof(int)))) { printf("开辟空间失败\n"); exit(1); } if(m->nu!=n->mu) { printf("不匹配\n"); exit(1); } q->mu=m->mu,q->nu=n->nu,q->tu=0; if(!(num=(int *)malloc((m->mu+1)*sizeof(int)))) { printf("开辟空间失败\n"); exit(1); } if(!(q->rpos=(int *)malloc((q->mu+1)*sizeof(int)))) { printf("空间开辟失败"); exit(1); } for(i=1;i<=q->mu;i++) num[i]=0; if(m->tu*n->tu!=0) { for(i=1;i<=m->mu;i++) for(j=1;j<=n->nu;j++) a[i*n->nu+j]=0; for(i=1;i<=m->tu;i++) { o=m->data[i].i; p=m->data[i].j; if(n->rpos[p]==0) continue; l=p+1; while(n->rpos[l]==0&&l<=n->mu) l++; if(l>n->mu) j=n->tu+1; else j=n->rpos[l]; for(k=n->rpos[p];k<j;k++) { x=n->data[k].i; y=n->data[k].j; if(a[o*n->nu+y]!=0) q->data[a[o*n->nu+y]].e+=m->data[i].e*n->data[k].e; else { q->data[++q->tu].e=m->data[i].e*n->data[k].e; q->data[q->tu].i=o; q->data[q->tu].j=y; a[o*n->nu+y]=q->tu; num[o]++; } } } for(i=1;i<=q->mu;i++) printf("%d ",num[i]); if(num[1]==0) { q->rpos[1]=0; j=0; } else { q->rpos[1]=1; j=num[1]; } for(i=2;i<=q->mu;i++) { if(num[i]==0) q->rpos[i]=0; else { q->rpos[i]=j+1; j+=num[i]; } if(j>=q->tu) break; } while(i<=q->mu) i++,q->rpos[i]=0; } }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯