1. 程式人生 > >壓縮感知中的常見測量矩陣及其MATLAB實現程式碼

壓縮感知中的常見測量矩陣及其MATLAB實現程式碼

題目:壓縮感知的常見測量矩陣

        下面首先給出十篇參考文獻中有關測量矩陣的敘述,然後以一篇碩士論文中對七種常見測量矩陣的描述依據,給出了這七種常見測量矩陣的MATLAB實現程式碼,以為以後的研究提供一個參考,由於目前還沒有一個簡單有效的測量矩陣評價方法,因此這裡給出的七種測量矩陣的程式碼的正確性並沒有驗證。由於本人對亂引參考文獻很受傷,經常按照引用的參考文獻對應去找原文卻找不到,所以這裡都是以截圖的方式給出,方便到去文獻中找到這裡的原文內容。

一、參考文獻中常見的測量矩陣

[1]喻玲娟,謝曉春.壓縮感知介紹[J].電視技術,2008,32(12):16-18.

[2]李樹濤,魏丹.壓縮感測綜述[J]. 自動化學報,2009,35(11):1369-1377.






[3]焦李成,楊淑媛,劉芳,侯彪. 壓縮感知回顧與展望[J]. 電子學報,2011,39(7):1651-1662.


[4]石光明,劉丹華,高大化,劉哲,林傑,王良君. 壓縮感知理論及其研究進展[J]. 電子學報,2009,37(5):1070-1081.


[5]李坤,馬彩文,李豔,陳萍.壓縮感知重構演算法綜述[J].紅外與鐳射工程,2013,42(z1):225-232.

[6]黨騤,馬林華,田雨,張海威,茹樂,李小蓓. m序列壓縮感知測量矩陣構造[J]. 西安電子科技大學(自然科學版),2015,42(2):215-222.

[7]朱志臻,周崇彬,劉發林,李濱兵,張志達. 用於壓縮感知的二值化測量矩陣[J]. 微波學報,2014,30(2):79-83,96.


[8]王學偉,崔廣偉,王琳,賈曉璐,聶偉.基於平衡Gold序列的壓縮感知測量矩陣的構造[J]. 儀器儀表學報,2014,35(1):97-102.

[9]張波,劉鬱林,王開.稀疏隨機矩陣有限等矩性質分析[J]. 電子與資訊學報,2014,36(1):169-174.

[10]王俠,王開,王青雲,樑瑞宇,左加闊,趙力,鄒採榮. 壓縮感知中的確定性隨機觀測矩陣構造[J]. 訊號處理,2014,30(4):436-442.



二、常見測量矩陣的MATLAB實現

        下面以文獻【吳贇.壓縮感知測量矩陣的研究[D]. 西安電子科技大學碩士學位論文,2012】為依據,給出文獻中2.2節內容所述的六種測量矩陣MATLAB實現程式碼,僅為一種參考實現方式,還未驗證其正確性。

1、高斯矩陣


        以下程式碼生成的高斯矩陣方差為1,若為改為1/M,只須將除以根號M即可。

  1. function [ Phi ] = GaussMtx( M,N )  
  2. %GaussMtx Summary of this function goes here  
  3. %   Generate Bernoulli matrix   
  4. %   M -- RowNumber  
  5. %   N -- ColumnNumber  
  6. %   Phi -- The Gauss matrix  
  7. %% Generate Gauss matrix     
  8.     Phi = randn(M,N);  
  9.     %Phi = Phi/sqrt(M);  
  10. end  

2、伯努利矩陣



        以下程式碼是按式(2-8)生成的伯努利矩陣,若要按式(2-9)生成則需使用後半部分註釋掉的程式碼即可。注意程式碼中用到了MATLAB自帶的randi函式,若你的MATLAB版本較低,可能要用randint函式代替,後面若用到此函式則一樣要注意這一點。

  1. function [ Phi ] = BernoulliMtx( M,N )  
  2. %BernoulliMtx Summary of this function goes here  
  3. %   Generate Bernoulli matrix   
  4. %   M -- RowNumber  
  5. %   N -- ColumnNumber  
  6. %   Phi -- The Bernoulli matrix  
  7. %% (1)Generate Bernoulli matrix(The first kind)  
  8. % 1--P=0.5   -1--P=0.5  
  9.     Phi = randi([0,1],M,N);%If your MATLAB version is too low,please use randint instead  
  10.     Phi(Phi==0) = -1;  
  11.     %Phi = Phi/sqrt(M);  
  12. % %% (2)Generate Bernoulli matrix(The second kind)  
  13. % % 1--P=1/6   -1--P=1/6  0--2/3  
  14. %     Phi = randi([-1,4],M,N);%If your MATLAB version is too low,please use randint instead  
  15. %     Phi(Phi==2) = 0;%P=1/6  
  16. %     Phi(Phi==3) = 0;%P=1/6  
  17. %     Phi(Phi==4) = 0;%P=1/6  
  18. %     %Phi = Phi*sqrt(3/M);  
  19. end  

3、部分哈達瑪矩陣


        由於MATLAB自帶的函式hadamard引數有限制,所以程式中首先計算滿足要求的引數L,需要注意的是,hadamard引數並不像文獻中所述僅為2的整數次冪,而是12的整數倍或20的整數倍或2的整數次冪,詳情在MATLAB檢視hadamard的help檔案。

  1. function [ Phi ] = PartHadamardMtx( M,N )  
  2. %PartHadamardMtx Summary of this function goes here  
  3. %   Generate part Hadamard matrix   
  4. %   M -- RowNumber  
  5. %   N -- ColumnNumber  
  6. %   Phi -- The part Hadamard matrix  
  7. %% parameter initialization  
  8. %Because the MATLAB function hadamard handles only the cases where n, n/12,  
  9. %or n/20 is a power of 2  
  10.     L_t = max(M,N);%Maybe L_t does not meet requirement of function hadamard  
  11.     L_t1 = (12 - mod(L_t,12)) + L_t;  
  12.     L_t2 = (20 - mod(L_t,20)) + L_t;   
  13.     L_t3 = 2^ceil(log2(L_t));  
  14.     L = min([L_t1,L_t2,L_t3]);%Get the minimum L  
  15. %% Generate part Hadamard matrix     
  16.     Phi = [];  
  17.     Phi_t = hadamard(L);  
  18.     RowIndex = randperm(L);  
  19.     Phi_t_r = Phi_t(RowIndex(1:M),:);  
  20.     ColIndex = randperm(L);  
  21.     Phi = Phi_t_r(:,ColIndex(1:N));  
  22. end  

4、部分傅立葉矩陣


        以下程式碼生成的是部分傅立葉矩陣,這裡要提的一點是,有關“歸一化”的概念在網上說法不一,一種說法是向量除以向量各項之和,另一種說法是向量除以向量的2範數(各項平方之和再開方),這裡採用後者。

  1. function [ Phi ] = PartFourierMtx( M,N )  
  2. %PartFourierMtx Summary of this function goes here  
  3. %   Generate part Fourier matrix   
  4. %   M -- RowNumber  
  5. %   N -- ColumnNumber  
  6. %   Phi -- The part Fourier matrix  
  7. %% Generate part Fourier matrix     
  8.     Phi_t = fft(eye(N,N))/sqrt(N);%Fourier matrix  
  9.     RowIndex = randperm(N);  
  10.     Phi = Phi_t(RowIndex(1:M),:);%Select M rows randomly  
  11.     %normalization  
  12.     for ii = 1:N  
  13.         Phi(:,ii) = Phi(:,ii)/norm(Phi(:,ii));  
  14.     end  
  15. end  

5、稀疏隨機矩陣


  1. function [ Phi ] = SparseRandomMtx( M,N,d )  
  2. %SparseRandomMtx Summary of this function goes here  
  3. %   Generate SparseRandom matrix   
  4. %   M -- RowNumber  
  5. %   N -- ColumnNumber  
  6. %   d -- The number of '1' in every column,d<M   
  7. %   Phi -- The SparseRandom matrix  
  8. %% Generate SparseRandom matrix     
  9.     Phi = zeros(M,N);  
  10.     for ii = 1:N  
  11.         ColIdx = randperm(M);  
  12.         Phi(ColIdx(1:d),ii) = 1;  
  13.     end  
  14. end  

6、託普利茲矩陣和迴圈矩陣


        這裡先給出託普利茲矩陣,文中說經過M次迴圈,這裡直接利用MATLAB自帶函式生成一個託普利茲方陣再取前M行。

  1. function [ Phi ] = ToeplitzMtx( M,N )  
  2. %ToeplitzMtx Summary of this function goes here  
  3. %   Generate Toeplitz matrix   
  4. %   M -- RowNumber  
  5. %   N -- ColumnNumber  
  6. %   Phi -- The Toeplitz matrix  
  7. %% Generate a random vector  
  8. %     %(1)Gauss  
  9. %     u = randn(1,2*N-1);  
  10.     %(2)Bernoulli  
  11.     u = randi([0,1],1,2*N-1);  
  12.     u(u==0) = -1;  
  13. %% Generate Toeplitz matrix     
  14.     Phi_t = toeplitz(u(N:end),fliplr(u(1:N)));  
  15.     Phi = Phi_t(1:M,:);  
  16. end  

        下面是迴圈矩陣,仍然利用MATLAB自帶函式生成。

  1. function [ Phi ] = CirculantMtx( M,N )  
  2. %CirculantMtx Summary of this function goes here  
  3. %   Generate Circulant matrix   
  4. %   M -- RowNumber  
  5. %   N -- ColumnNumber  
  6. %   Phi -- The Circulant matrix  
  7. %% Generate a random vector  
  8. %     %(1)Gauss  
  9. %     u = randn(1,N);  
  10.     %(2)Bernoulli  
  11.     u = randi([0,1],1,N);  
  12.     u(u==0) = -1;  
  13. %% Generate Circulant matrix     
  14.     Phi_t = toeplitz(circshift(u,[1,1]),fliplr(u(1:N)));  
  15.     Phi = Phi_t(1:M,:);  
  16. end  

        以上都是採用MATLAB自帶的toeplitz函式,這需要首先生成一個隨機向量,而託普利茲矩陣和迴圈矩陣的區別也就在於這個隨機向量的結構不同,注意程式碼中有關toeplitz函式的兩個輸入引數好好體會即可。