实现匹配追踪算法

时间:2015-06-03 06:48:58

标签: matlab image-processing sparse-matrix

我已经实现了匹配追踪算法,但我无法获得所需的结果。

这是我的代码:

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非零值。你能帮我找出错误的位置吗?

感谢。

3 个答案:

答案 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