我已经实现了匹配追踪算法,但我无法获得所需的结果。
这是我的代码:
D=[1 6 11 16 21 26 31 36 41 46
2 7 12 17 22 27 32 37 42 47
3 8 13 18 23 28 33 38 43 48
4 9 14 19 24 29 34 39 44 49
5 10 15 20 25 30 35 40 45 50];
b=[6;7;8;9;10];
n=size(D);
A1=zeros(n);
R=b;
H=10;
if(H <= 0)
error('The number of iterations needs to be greater then 0')
end;
for k=1:1:H
[c,d] = max(abs(D'*R)); %//'
A1(:,d)=D(:,d);
D(:,d)=0;
y = A1\b;
R = b-A1*y;
end
输出
y=
0.8889
0
0
0
0
0
0
0
0
0.1111
我应该只在(2,1)
得到非零值,其他值应为零,但我得到2非零值。你能帮我找出错误的位置吗?
感谢。
答案 0 :(得分:1)
我检查过: http://www.scholarpedia.org/article/Matching_pursuit
您的功能需要规范化!
D = D./repmat(sum(D,1),5,1);
我得到以下算法:
D=[1 6 11 16 21 26 31 36 41 46
2 7 12 17 22 27 32 37 42 47
3 8 13 18 23 28 33 38 43 48
4 9 14 19 24 29 34 39 44 49
5 10 15 20 25 30 35 40 45 50];
D = D./repmat(sum(D,1),5,1);
b=[6;7;8;9;10];
n=size(D);
A1=zeros(n);
R=b;
H=100;
if(H <= 0)
error('The number of iterations needs to be greater then 0')
end;
a = zeros(1,H);
G = zeros(size(D,1),H);
for k=1:1:H
ip = D'*R;
[~,d] = max(abs(ip)); %//'
G(:,k) = D(:,d);
a(k) = ip(d);
R = R-a(k)*G(:,k);
end
% recover signal:
Rrec = zeros(size(R));
for i=1:H
Rrec = Rrec + a(i)*G(:,i);
end
figure();
plot(b);
hold on;
plot(Rrec)
它非常接近信号。但不是D(:,2)首先是预期的。也许这是一个起点...
答案 1 :(得分:1)
这是更新的代码。这基于https://en.wikipedia.org/wiki/Matching_pursuit
提供的算法clc;
clear all;
D=[1 6 11 16 21 26 31 36 41 46
2 7 12 17 22 27 32 37 42 47
3 8 13 18 23 28 33 38 43 48
4 9 14 19 24 29 34 39 44 49
5 10 15 20 25 30 35 40 45 50];
b=[6;7;8;9;10];
H=10;
for index=1:10
G(:,index)=D(:,index)./norm(D(:,index));
end
G1=G;
n=size(G);
R=b;
if(H <= 0)
error('The number of iterations needs to be greater then 0')
end;
if(H >size(D,2))
error('The number of iterations needs to be less than dictionary size')
end;
bIndex=1:size(G,2);
for k=H:-1:1
innerProduct=[];
for index=1:size(G,2)
innerProduct(index)=dot(R,G(:,index));
end
[c,d] = max(abs(innerProduct));
An(H-k+1)=innerProduct(d);
R = R-(An(H-k+1)*G(:,d));
G(:,d)=[];
strong(H-k+1)=bIndex(d);
bIndex(d)=[];
end
G_new=G1(:,strong);
%% reconstruction
bReconstructed=zeros(size(G_new,1),1);
for index=1:size(G_new,2)
bReconstructed(:,index) = (An(index)*G_new(:,index));
end
b_new=sum(bReconstructed,2)
答案 2 :(得分:0)
是的,必须对字典中的原子进行归一化,以便可以公平比较当前残差与不同原子的内积。
您可能要检查我的OMP实施,其中还包括https://github.com/indigits/sparse-plex/blob/master/library/%2Bspx/%2Bpursuit/%2Bsingle/omp_chol.m
处OMP最小平方步的增量Cholesky更新。我在https://sparse-plex.readthedocs.io/en/latest/book/pursuit/omp/index.html
的图书馆文档中写了关于OMP的详细教程说明。我的库sparse-plex包含OMP的C实现,它比最快的MATLAB实现快四倍。请参见此处的讨论https://sparse-plex.readthedocs.io/en/latest/book/pursuit/omp/fast_omp.html