基于交替投影法的压缩感知采样矩阵优化
项目介绍
本项目致力于解决压缩感知(Compressive Sensing, CS)系统设计中的核心问题——采样矩阵(测量矩阵)的优化。在压缩感知理论中,采样矩阵的性质直接决定了稀疏信号重构的精确度和概率。理论研究表明,采样矩阵各列之间的互相关性(Mutual Coherence)越小,且越接近理论下界(Welch Bound),矩阵越容易满足约束等距性条件(RIP),从而提供更优的重构性能。
本项目基于交替投影(Alternating Projection)算法,实现了一种迭代优化方案。程序从一个初始化的随机高斯矩阵出发,通过在“低互相关性结构集合”和“矩阵秩约束集合”之间进行交替投影,逐步修正矩阵元素,最终生成一个互相关性极低的优化采样矩阵。
功能特性
- Welch界限计算:自动根据设定的矩阵维度($M times N$)计算互相关性的理论下界(Welch Bound),作为优化的目标参照。
- 交替投影迭代算法:
* 实现基于Gram矩阵的阈值收缩操作,降低非对角元素相关性。
* 实现基于特征值分解(EIG)的秩约束重构,确保矩阵满足采样维度的秩要求。
- 自动收敛检测:内置收敛监测机制,当互相关性变化低于预设阈值或达到最大迭代次数时自动停止。
- 全方位可视化分析:
*
收敛曲线:实时展示互相关性随迭代次数下降并逼近Welch界的过程。
*
直方图对比:直观对比优化前后Gram矩阵非对角元素的分布情况。
*
热力图:可视化最终矩阵的Gram矩阵结构。
- 奇异值验证:计算并输出优化后矩阵的奇异值分布,辅助验证矩阵的RIP特性。
系统要求
- MATLAB R2016b 或更高版本
- 无需额外工具箱(主要使用基础矩阵运算及绘图函数)
使用方法
- 将项目代码保存为脚本文件。
- 在MATLAB环境中直接运行主脚本。
- 程序将输出优化过程中的进度条,控制台将打印初始及最终的互相关性指标。
- 运行结束后,系统会弹出一个包含三个子图的分析窗口,展示优化效果。
---
核心算法与实现逻辑
本项目的主程序 main 严格遵循交替投影法的数学流程,具体实现逻辑如下:
1. 初始化阶段
- 参数配置:设定采样维度 $M=50$,信号维度 $N=256$,最大迭代次数 $500$。
- 理论界限:根据公式 $mu_{Welch} = sqrt{frac{N-M}{M(N-1)}}$ 计算目标阈值。
- 初始矩阵生成:创建一个服从 $N(0, 1/M)$ 分布的随机高斯矩阵,并对其每一列进行欧几里得范数归一化(Unit Norm),确保列向量位于单位超球面上。
2. 迭代优化循环 (Alternating Projection)
程序进入主循环,执行以下步骤直至收敛:
计算当前采样矩阵 $Phi$ 的 Gram 矩阵 $G = Phi^T Phi$。该矩阵反映了所有列向量之间的内积(相关性)。
为了降低互相关性,算法检查 $G$ 中的所有非对角元素。
* 如果某元素的绝对值 $|g_{ij}|$ 超过了理论 Welch 界限,则将其幅度强制截断(Shrink)至 Welch 界限,同时保持其符号不变。
* 强制对角线元素为 1,以维持列向量的单位范数特性。
由于采样矩阵 $Phi$ 的尺寸为 $M times N$,其对应的 Gram 矩阵 $G$ 的秩理论上不应超过 $M$。
* 对修改后的 $G$ 进行特征值分解(Eigenvalue Decomposition)。
* 截取最大的 $M$ 个特征值及其对应的特征向量,丢弃其余部分,以此强制矩阵的秩为 $M$。
* 利用截取后的特征值 $Sigma_{eff}$ 和特征向量 $V_{sorted}$ 重构最优采样矩阵:$Phi_{opt} = Sigma_{eff}^{1/2} V_{sorted}^T$。
对重构后的矩阵 $Phi_{opt}$ 的每一列再次执行单位范数归一化,防止数值计算误差导致列向量模长偏离 1。
计算当前的互相关性系数 $mu$,并与上一次迭代的结果比较。如果变化量小于容差
Tol (1e-6),则判定算法收敛并提前退出循环。
3. 结果分析与验证
迭代结束后,程序执行以下评估:
- 互相关性对比:计算最终矩阵的最大互相关性,并输出相对于初始随机矩阵的性能提升百分比。
- 奇异值分析:计算最终矩阵 $Phi$ 的所有奇异值(SVD),观察其分布范围,奇异值越集中说明矩阵的正交性越好。
---
关键代码细节解析
calculate_coherence 辅助函数
- 该函数用于计算矩阵的互相关性指标 $mu$。
- 实现逻辑是先计算 $G = A^T A$,取该矩阵的绝对值,将对角线元素置零(忽略自相关),然后寻找矩阵中剩余元素的最大值。这是衡量采样矩阵优劣的最核心指标。
Gram矩阵的特征分解重构
- 代码中利用
[V, D] = eig(G_new, 'vector') 获取全部特征对。 - 关键操作
Phi_opt = S_eff * V_sorted(:, 1:M)' 实际上是从 Gram 矩阵的空间逆向恢复出采样矩阵 $Phi$。由于 $G approx Phi^T Phi$,通过保留前 $M$ 个主成分,找到了能够生成该 Gram 矩阵的最佳 $M$ 维基底,从而保证了生成的 $Phi$ 具有正确的维度和秩。
非对角元素截断 (Clipping)
- 代码片段
G_new(mask) = sign(G(mask)) * target_mu 实现了硬阈值策略。这意味着算法严格禁止任何列向量间的相关性大幅超过 Welch 界限。虽然代码中定义了 LearningConstant,但在实际的核心收缩步骤中直接使用了目标阈值截断,这种方法收敛速度较快。