简单点说,一个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)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)