1.完整项目描述和程序获取
>面包多安全交易平台:https://mbd.pub/o/bread/ZJaamZtq
>如果链接失效,可以直接打开本站店铺搜索相关店铺:
>如果链接失效,程序调试报错或者项目合作也可以加微信或者QQ联系。
2.部分仿真图预览
3.算法概述
K-SVD可以看做K-means的一种泛化形式,K-means算法总每个信号量只能用一个原子来近似表示,而K-SVD中每个信号是用多个原子的线性组合来表示的。K-SVD通过构建字典来对数据进行稀疏表示,经常用于图像压缩、编码、分类等应用。Y为要表示的信号,D为超完备矩阵(列数大于行数), X为系数矩阵,X与Y按列对应,表示D中元素按照Xi为系数线性组合为Y,我们的目的是找到让X尽量稀疏的D。
4.部分源码
function a=OMP2(D,x,sigma)
[n,K]=size(D);
a=[];
residual=x;
err=residual'*residual;
E2=1.15*sigma^2*n;
indx=zeros(1,K);
t=0;
while err > E2 && t < K/2
t=t+1;
proj=D'*residual;
pos=find(abs(proj)==max(abs(proj)));
pos=pos(1);
indx(t)=pos;
a=pinv(D(:,indx(1:t)))*x;
residual=x-D(:,indx(1:t))*a;
err=residual'*residual;
end;
indx(indx==0)=[];
temp=zeros(K,1);
temp(indx)=a;
a=sparse(temp);
return;
function [nextDicMtx, nextSparRepMtx] = K_SVD(dataMtx, curDicMtx, curSparRepMtx)
nextDicMtx(:,1) = curDicMtx(:,1);
for j = 2:1:size(curDicMtx,2)
usedIndex = find(curSparRepMtx(j,:));
if ~isempty(usedIndex)
tmpSparRepMtx = curSparRepMtx(:,usedIndex);
tmpSparRepMtx(j,:) = 0;
errMtx = dataMtx(:,usedIndex)-curDicMtx*tmpSparRepMtx;
[nextDicAtom,singularVal,nextSparVec] = svds(errMtx,1);
nextSparRepMtx(j,usedIndex) = singularVal*nextSparVec';
nextDicMtx(:,j) = nextDicAtom;
else
nextDicMtx(:,j) = curDicMtx(:,j);
end;
end;
A518