压缩感知与稀疏表示恢复是信号处理领域的核心研究方向,L1同伦算法作为其中的经典求解工具,因其高效稳定的特性被广泛采用。其核心思想简洁明了:通过逐步衰减正则化参数,沿同伦路径逼近稀疏信号的最优解。该算法能够从欠采样测量值中精准恢复具有稀疏结构的信号,在工程实践中实用性极强。

MATLAB代码实现
1. L1同伦算法函数
function x = l1_homotopy(y, A, lambda_max, tol, max_iter)
% L1同伦算法(稀疏恢复核心函数)
% 输入参数:
% y - 测量值(观测向量)
% A - 测量矩阵(需满足RIP条件)
% lambda_max - 初始正则化参数(通常取较大值)
% tol - 收敛容差(控制精度)
% max_iter - 最大迭代次数(防止无限循环)
% 输出:
% x - 恢复的稀疏信号(近似真实稀疏解)
% 初始化
[m, n] = size(A);
x = zeros(n, 1); % 信号初始化为零
lambda = lambda_max; % 当前正则化参数
r = y - A * x; % 残差向量
v = A' * r; % 梯度向量(对偶变量)
% 同伦路径迭代
for iter = 1:max_iter
% 通过软阈值算子更新信号
x = soft_threshold(x + v / lambda, 1 / lambda);
% 更新残差与梯度
r = y - A * x;
v = A' * r;
% 检查收敛条件(基于无穷范数)
if norm(v, 'inf') < tol
break;
end
% 按指数衰减策略更新lambda
lambda = lambda / 2;
end
end
% 软阈值函数(施加L1范数惩罚)
function x = soft_threshold(x, threshold)
x = sign(x) .* max(abs(x) - threshold, 0);
end
2. 主程序
% 主程序:演示L1同伦算法恢复稀疏信号
clc;
clear;
% 参数配置
n = 256; % 信号长度
k = 10; % 稀疏度(非零元素个数)
m = 60; % 观测数(远小于信号长度)
lambda_max = 1e2; % 初始正则化参数
tol = 1e-4; % 收敛容差
max_iter = 1000; % 最大迭代次数
% 生成真实稀疏信号
x_true = zeros(n, 1);
x_true(randperm(n, k)) = randn(k, 1); % 随机位置赋高斯值
% 构造测量矩阵(归一化随机高斯矩阵)
A = randn(m, n) / sqrt(m);
% 获取观测向量
y = A * x_true;
% 调用L1同伦算法进行稀疏恢复
x_recovered = l1_homotopy(y, A, lambda_max, tol, max_iter);
% 可视化对比
figure;
subplot(2, 1, 1);
stem(x_true);
title('原始稀疏信号');
xlabel('索引');
ylabel('幅度');
subplot(2, 1, 2);
stem(x_recovered);
title('恢复后的稀疏信号');
xlabel('索引');
ylabel('幅度');
说明
L1同伦算法的精髓在于从较大的正则化参数lambda出发,通过迭代逐步减半参数值,使解的支撑集逐渐稳定并收敛至真实稀疏解。每一步借助软阈值算子施加L1范数约束,最终实现精确恢复。主程序演示了完整工作流:构造长度为256、稀疏度仅10的稀疏向量,采用60次随机高斯线性测量获取观测值,随后调用同伦算法恢复,并通过对比图直观展示原始信号与重建结果——可见效果非常理想。
注意
- 参数选择:
lambda_max作为初始正则化参数,通常设置为较大数值(如100)即可正常工作;tol控制收敛精度,影响重建质量;max_iter用于防止无限循环,实际应用中1000次迭代通常足够。 - 测量矩阵:本示例采用随机高斯矩阵,而在实际工程中,测量矩阵
A最好满足受限等距性质(RIP),这是保证准确恢复的理论基础。高斯随机矩阵是典型的RIP矩阵,初学者可放心使用。
