1.算法仿真效果 matlab2022a仿真结果如下:
2.算法涉及理论知识概要 K-SVD可以看做K-means的一种泛化形式,K-means算法总每个信号量只能用一个原子来近似表示,而K-SVD中每个信号是用多个原子的线性组合来表示的。K-SVD通过构建字典来对数据进行稀疏表示,经常用于图像压缩、编码、分类等应用。Y为要表示的信号,D为超完备矩阵(列数大于行数), X为系数矩阵,X与Y按列对应,表示D中元素按照Xi为系数线性组合为Y,我们的目的是找到让X尽量稀疏的D
字典学习的思想应该源来实际生活中的字典的概念。字典是前辈们学习总结的精华,当我们需要学习新的知识的时候,不必与先辈们一样去学习先辈们所有学习过的知识,我们可以参考先辈们给我们总结的字典,通过查阅这些字典,我们可以大致学会到这些知识。
为了将上述过程用准确的数学语言描述出来,我们需要将“总结字典”、“查阅字典”做出一个更为准确的描述。就从我们的常识出发:
我们通常会要求的我们的字典尽可能全面,也就是说总结出的字典不能漏下关键的知识点。
查字典的时候,我们想要我们查字典的过程尽可能简洁,迅速,准确。即,查字典要快、准、狠。 查到的结果,要尽可能地还原出原来知识。当然,如果要完全还原出来,那么这个字典和查字典的方法会变得非常复杂,所以我们只需要尽可能地还原出原知识点即可。
3.MATLAB核心程序
[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;
标签:KSVD,usedIndex,图像去噪,residual,curDicMtx,indx,查字典,matlab,字典
From: https://blog.51cto.com/matworld/6374640