利用matlab采用ADMM算法对稀疏信号进行复原
生活随笔
收集整理的這篇文章主要介紹了
利用matlab采用ADMM算法对稀疏信号进行复原
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在這篇文章中中,我將給出如何實現稀疏信號恢復的ADMM方法的細節。具體代碼如下:
clear; close all; clc; rng(0); % for reproducibility, do not change it! m = 50; % num samples n = 200; % num variables, note that n > mA = rand(m, n); % simulate matrix A 模擬矩陣A x = zeros(n, 1); % simulate true sparse signal x: line 13-16 模擬稀疏信號 nz = 10; % nz_idx = randperm(n); x(nz_idx(1:nz)) = 2 * rand(nz, 1); y = A*x; % simulate a degraded signal y = y + 0.1 * rand(m, 1); % add some noise to the degraded signal[m, n] = size(A);b = zeros(n,1); %n行1列 b1 = zeros(m,1); b2 = zeros(n,1);beta1 = 1e-1; % The para. in Algrithm 1 beta2 = 1e-2; lambda = 1e-2;k=0; ReErr=1; maxitr = 500; tol = 1e-8; b_old = b; b1_old = b1; b2_old = b2;while ReErr> tol && k<maxitru_old = sign(y-A*b_old-b1_old).*max(abs(y-A*b_old-b1_old)-1/beta1,0) ;%第一次計算uv_old = sign(b_old-b2_old).*max(abs(b_old-b2_old)-lambda /beta2,0) ;%第一次計算vI = eye(n,n); b_new = (inv(beta1*((A.')*A)+beta2.*I))*(beta2*(v_old+b2_old)-beta1*(A.')*(u_old-y +b1_old));%更新b的值b1_new = b1_old+1.618*(u_old-(y-A*b_new)); b2_new = b2_old+1.618*(v_old-b_new); b1_old = b1_new; b2_old = b2_new;ReErr = norm((b_new-b_old),2)./ norm(b_new,2); b_old = b_new;k=k+1;endfigure, subplot(1, 3, 1); plot(x,'b-','Linewidth',2), axis tight; title('Original signal: b');subplot(1, 3, 2); plot(y,'r-','Linewidth',2), axis tight; title('Noisy signal: y=Ab');subplot(1, 3, 3); plot(b_old,'g-','Linewidth',2), axis tight; title('recoverd signal: b by the solution of (1)');`總結
以上是生活随笔為你收集整理的利用matlab采用ADMM算法对稀疏信号进行复原的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python不是内部文件_已安装pyth
- 下一篇: mysql windows身份验证_SQ