资源描述:
《MATLAB稀疏表示算法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、functionA=OMP(D,X,L)%输入参数:% D-过完备字典,注意:必须字典的各列必须经过了规范化% X-信号% L-系数中非零元个数的最大值(可选,默认为D的列数,速度可能慢)%输出参数:% A-稀疏系数ifnargin==2 L=size(D,2);endP=size(X,2);K=size(D,2);fork=1:1:P, a=[]; x=X(:,k); residual=x; indx=zeros(L,1); forj=1:1:L, proj=D'*residual; [maxVal,pos]=max(abs
2、(proj)); pos=pos(1); indx(j)=pos; a=pinv(D(:,indx(1:j)))*x; residual=x-D(:,indx(1:j))*a; ifsum(residual.^2)<1e-6 break; end end; temp=zeros(K,1); temp(indx(1:j))=a; A(:,k)=sparse(temp);end;return;function[A,x]=KSVD(y,codebook_size,errGoal)%===================
3、===========%inputparameter% y-inputsignal% codebook_size-countofatoms%outputparameter% A-dictionary% x-coefficent%reference:K-SVD:AnAlgorithmforDesigningofOvercompleteDictionaries% forSparseRepresentation,AharonM.,EladM.etc%==============================if(size(y,2)4、 disp('codebook_sizeistoolargeortrainingsamplesistoosmall');%显示”” return;end%initialization[rows,cols]=size(y);%y的行、列数目分别赋值给rows、colsr=randperm(cols);%r为维度为cols的随机置换向量A=y(:,r(1:codebook_size));%将y的第(r的第1个到第“原子个数个”数)列提取出构成初始字典AA=A./repmat(sqrt(sum(A.^2,1)),rows,1);ksvd_iter=10;fork=1:k
5、svd_iter %sparsecoding ifnargin==2 x=OMP(A,y,5.0/6*rows); elseifnargin==3 x=OMPerr(A,y,errGoal); end %updatedictionary form=1:codebook_size mindex=find(x(m,:)); if~isempty(mindex)%若mindex为空矩阵,则返回0 mx=x(:,mindex); mx(m,:)=0; my=A*mx; resy=y(:,mindex
6、); mE=resy-my; [u,s,v]=svds(mE,1); A(:,m)=u; x(m,mindex)=s*v'; end endend