稀疏表示是什么意思啊?

稀疏表示是什么意思啊?,第1张

稀疏表示,即对于一个N维的信号,我们通过一些变换,可以只用K个非零系数来近似或完整的表示该信号。K<<N。

简单点说,一个n维信号y

y=a1*x1+a2*x2+......+ai*xi+......+an*xn

其中只有K个ai非零,其余的N-k个系数为零或小到可以悉禅忽略,K<<N。那么一个N维的信号就用远小于N个向量就表示了,这样就实现了数据的压缩。稀疏表示在信号传睁侍尘输压缩和信号重构等方面有着谈巧重要的应用。

这个程序能实现矩阵的加减乘。

从中删除你不需要的部分你会吧。

#include<iostream.h>

#include<malloc.h>

#define TRUE 1

#define ERROR 0

#define OK 1

#define MAXISIZE 100

typedef int Elemtype

typedef int Status

struct Triple

{

int i,j//行下标,列下标

Elemtype e //非零元数的值

}

struct TSMatrix

{

Triple data[MAXISIZE+1]

int mu,nu,tu //矩阵的行数,列数,非零元数

}

Status CreateSMatrix(TSMatrix &M)

{

int i,m,n

Elemtype e

Status k

cout<<"输入矩阵的行数,列数,非零元数:\n"

cin>>M.mu>>M.nu>>M.tu

M.data[0].i=0

for(i=1i<=M.tui++)

{

do

{

cout<<"输入第"<<i<<"个非零元素所在的行槐州扒(1~"<<M.mu<<"),列(1~"<<M.nu<<"),元素值:\n"

cin>>m>>n>>e

k=0

if(m<1||m>迹举M.mu||n<1||n>M.nu)

{ k=1

cout<<"元素的行列数输入错误!\n"}

if(m<M.data[i-1].i||m==M.data[i-1].i&&n<=M.data[i-1].j)

k=1

}while(k)

M.data[i].i=m

M.data[i].j=n

M.data[i].e=e

}

return OK

}

void DestroySMatrix(TSMatrix &M)

{

M.mu=0

M.nu=0

M.tu=0

}

void PrintSMatrix(TSMatrix M)

{

int i

cout<<M.mu<<"行"<<M.nu<<"列"<<M.tu<<"个非零元数\n"

cout<<"行 列 元素值\n"

for(i=1i<铅昌=M.tui++)

cout<<M.data[i].i<<" "<<M.data[i].j<<" "<<M.data[i].e<<endl

}

Status Cmp(int a,int b)

{ if(a<b) return 1

else if(a==b) return 0

else return -1

}

Status AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)

{

Triple *Mp,*Me,*Np,*Ne,*Qh,*Qe

if(M.mu!=N.mu||M.nu!=N.nu)

return ERROR

Q.mu=M.mu

Q.nu=M.nu

Mp=&M.data[1]

Np=&N.data[1]

Me=&M.data[M.tu]

Ne=&N.data[N.tu]

Qh=Qe=Q.data

while(Mp<=Me&&Np<=Ne)

{ Qe++

switch(Cmp(Mp->i,Np->i))

{

case 1: *Qe=*Mp

Mp++

break

case 0: switch(Cmp(Mp->j,Np->j))

{

case 1: *Qe=*Mp

Mp++

break

case 0: *Qe=*Mp

Qe->e+=Np->e

if(!Qe->e)

Qe--

Mp++

Np++

break

case -1: *Qe=*Np

Np++

}

break

case -1: *Qe=*Np

Np++

}

}

if(Mp>Me)

while(Np<=Ne)

{

Qe++

*Qe=*Np

Np++

}

if(Np>Ne)

while(Mp<=Me)

{

Qe++

*Qe=*Mp

Mp++

}

Q.tu=Qe-Qh

return OK

}

Status SubSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)

{

int i,l

for(i=1i<=N.tui++)

N.data[i].e*=-1

l=AddSMatrix(M,N,Q)

return l

}

Status MultSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)

{

int i,j,h=M.mu,l=N.nu,Qn=0

Elemtype *Qe

if(M.nu!=N.mu)

return ERROR

Q.mu=M.mu

Q.nu=N.nu

Qe=(Elemtype *)malloc(h*l*sizeof(Elemtype))

for(i=0i<h*li++)

*(Qe+i)=0

for(i=1i<=M.tui++)

for(j=1j<=N.tuj++)

if(M.data[i].j==N.data[j].i)

*(Qe+(M.data[i].i-1)*l+N.data[j].j-1)+=M.data[i].e*N.data[j].e

for(i=1i<=M.mui++)

for(j=1j<=N.nuj++)

if(*(Qe+(i-1)*l+j-1)!=0)

{

Qn++

Q.data[Qn].e=*(Qe+(i-1)*l+j-1)

Q.data[Qn].i=i

Q.data[Qn].j=j

}

free(Qe)

Q.tu=Qn

return OK

}

void main()

{char a

int h

TSMatrix A,B,C

cout<<"创建矩阵A:\n"

CreateSMatrix(A)

PrintSMatrix(A)

cout<<"创建矩阵B:\n"

CreateSMatrix(B)

PrintSMatrix(B)

cout<<"选择 *** 作:\n"<<"A.两稀疏矩阵的和\n"<<"B.两稀疏矩阵的差\n"<<"C.两稀疏矩阵的积\n"<<"Q.退出\n"

cin>>a

while(a!='Q')

{

switch(a)

{

case 'A':

h=AddSMatrix(A,B,C)

if(h==1)

{cout<<"两稀疏矩阵的和为:\n"

PrintSMatrix(C)

}

else cout<<"该两稀疏矩阵不能求和!\n"

break

case 'B':

h=SubSMatrix(A,B,C)

if(h==1)

{ cout<<"两稀疏矩阵的差为:\n"

PrintSMatrix(C)

}

else cout<<"该两稀疏矩阵不能求差!\n"

break

case 'C':

h=MultSMatrix(A,B,C)

if(h==1)

{cout<<"两稀疏矩阵的积为:\n"

PrintSMatrix(C)

}

else cout<<"两稀疏矩阵不能求积!\n"

break

default: cout<<"输入错误!请重新输入\n"

}cin>>a

}DestroySMatrix(A)

DestroySMatrix(B)

DestroySMatrix(C)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12312883.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存