Matlab实现OMP(匹配追踪)

这个网上资源还是挺多哒。
我的作用仅是调试出来。

老规矩,注释必须全。抱拳。

%主文件
clc;
clear;
y=[7.6030 -4.1781 3.1123 1.0586 7.8053]';
A=[0.5377 -1.3077 -1.3499 -0.2050 0.6715 1.0347 0.8884;
    1.8339 -0.4336 3.3049 -0.1241 -1.2075 0.7269 -1.1471;
    -2.2588 0.3426 0.7254 1.4897 0.7172 -0.3034 -1.0689;
    0.8622 3.5784 -0.0631 1.4090 1.6302 0.2939 0.8095;
    0.3188 2.7694 0.7147 1.4172 0.4889 -0.7873 -2.9443];
CS_OMP(y,A,7);
%函数:CS_OMP
function [theta]=CS_OMP(y,A,t)
    %size可算出行和列分别是多少
    [y_rows,y_columns]=size(y);
    if y_rows<y_columns
        y=y';
    end
    [M,N]=size(A);                            %传感矩阵A为M*N矩阵
    theta=zeros(N,1);                         %用来存储恢复的theta(列向量)
    theta_ls=zeros(N,1);
    At=zeros(M,t);                            %用来迭代过程中存储A被选择的列
    Pos_theta=zeros(1,t);                    %用来迭代过程中存储A被选择的列序号
    r_n=y;                                    %初始化残差(residual)为y
    for ii=1:t                                  %迭代t次,t为输入参数
        fprintf('迭代次数:%d\n',ii);
        product=A'*r_n;                       %传感矩阵A各列与残差的内积
        fprintf('内积:');
        disp(product');                        %显示内积
        [value,pos]=max(abs(product));          %找到最大内积绝对值,即与残差最相关的列
        At(:,ii)=A(:,pos);                     %存储这一列
        fprintf('theta:\n')
        disp(At);
        Pos_theta(ii)=pos;                     %存储这一列的序号
        fprintf('已选择序列:');
        disp(Pos_theta);
        A(:,pos)=zeros(M,1);                   %清零A的这一列,其实此行可以不要,因为它与残差正交                                                        
        theta_ls=(At(:,1:ii)'*At(:,1:ii))^(-1)*At(:,1:ii)'*y;  %正交化
        fprintf('当前系数:');
        disp(theta_ls');                                                       
        r_n=y-At(:,1:ii)*theta_ls;             %更新残差,y一直是原始值
        fprintf('残差:');
        disp(r_n');
        error=sum(r_n.^2);                     %计算误差
        fprintf('误差=%d\n',error);
        if error < 1e-6                        %误差小于一定值结束迭代
            disp(ii);
            break;  
        end
    end
    for j=1:ii
        Pos(j)=Pos_theta(j);
    end
    fprintf('最终选定向量的下标有:')
    disp(Pos_theta);
    fprintf('系数集合:');
    disp(theta_ls');
    fprintf('归位后的系数:');
    theta(Pos)=theta_ls;  
    disp(theta');
 end 
  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
OMP (正交匹配追踪)是一种压缩感知图像重建方法,它可以从较少的线性测量样本中重建稀疏信号。而MATLAB是一个编程平台,用于数学分析、算法开发和数据可视化等领域。 在MATLAB实现OMP图像重建,需要进行以下步骤: 1. 读取图像并将其转换为灰度图像。可以使用imread函数读取图像,使用rgb2gray函数将其转换为灰度图像。 2. 将灰度图像转换为一维向量。使用reshape函数将灰度图像转换为一维向量,方便后续的运算。 3. 选择测量矩阵。在OMP中,测量矩阵通常使用随机矩阵,如高斯矩阵或伯努利矩阵等。可以使用randn函数生成高斯矩阵,使用randperm函数生成伯努利矩阵。测量矩阵的列数应该等于信号的长度,行数应该大于等于信号的稀疏度。 4. 进行测量。将信号向量与测量矩阵相乘,得到测量向量。 5. 进行OMP迭代。在每次迭代中,选择测量向量中与残差最相关的列,并将其加入字典中。使用最小二乘法求解稀疏系数。将残差与测量矩阵的线性空间的正交补中与字典中相加得到重建信号的估计值。重复迭代直到残差足够小或达到预设的迭代次数。 6. 将重建信号的一维向量转换为图像。使用reshape函数将一维向量转换为二维图像。 7. 显示重建图像。使用imshow函数显示重建图像。 以上步骤是实现OMP图像重建的基本流程,在具体实现过程中需要注意数据类型的转换、测量矩阵的选择和迭代次数的设定等细节问题。同时也需要了解各种图像处理算法的原理和应用范围,以便更加准确地选择和使用算法。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值