压缩感知(六)

常用测量矩阵及matlab实现

随机高斯测量矩阵

function [ Phi ] = GaussMtx( M,N )
%GaussMtx Summary of this function goes here
%Generate Bernoulli matrix
%M -- RowNumber
%N -- ColumnNumber
%Phi -- The Gauss matrix

%% Generate Gauss matrix  
    Phi = randn(M,N);
    %Phi = Phi/sqrt(M);
end

随机贝努力测量矩阵

function [ Phi ] = BernoulliMtx( M,N )
%BernoulliMtx Summary of this function goes here
%Generate Bernoulli matrix
%M -- RowNumber
%N -- ColumnNumber
%Phi -- The Bernoulli matrix

%% (1)Generate Bernoulli matrix(The first kind)
% 1--P=0.5   -1--P=0.5
    Phi = randi([0,1],M,N);%If your MATLAB version is too low,please use randint instead
    Phi(Phi==0) = -1;
    %Phi = Phi/sqrt(M);

%% (2)Generate Bernoulli matrix(The second kind)
% 1--P=1/6   -1--P=1/6  0--2/3
%     Phi = randi([-1,4],M,N);%If your MATLAB version is too low,please use randint instead

%     Phi(Phi==2) = 0;%P=1/6
%     Phi(Phi==3) = 0;%P=1/6
%     Phi(Phi==4) = 0;%P=1/6
%     %Phi = Phi*sqrt(3/M);

end

 

部分哈达玛测量矩阵

function [ Phi ] = PartHadamardMtx( M,N )
%PartHadamardMtx Summary of this function goes here
%Generate part Hadamard matrix
%M -- RowNumber
%N -- ColumnNumber
%Phi -- The part Hadamard matrix

%% parameter initialization
%Because the MATLAB function hadamard handles only the cases where n, n/12,
%or n/20 is a power of 2

    L_t = max(M,N);   %Maybe L_t does not meet requirement of function hadamard
    L_t1 = (12 - mod(L_t,12)) + L_t;
    L_t2 = (20 - mod(L_t,20)) + L_t;
    L_t3 = 2^ceil(log2(L_t));
    L = min([L_t1,L_t2,L_t3]);%Get the minimum L

%% Generate part Hadamard matrix  

    Phi = [];
    Phi_t = hadamard(L);
    RowIndex = randperm(L);
    Phi_t_r = Phi_t(RowIndex(1:M),:);
    ColIndex = randperm(L);
    Phi = Phi_t_r(:,ColIndex(1:N));
end

 

部分傅里叶测量矩阵

function [ Phi ] = PartFourierMtx( M,N )
%PartFourierMtx Summary of this function goes here
%Generate part Fourier matrix
%M -- RowNumber
%N -- ColumnNumber
%Phi -- The part Fourier matrix

%% Generate part Fourier matrix  

    Phi_t = fft(eye(N,N))/sqrt(N);%Fourier matrix
    RowIndex = randperm(N);
    Phi = Phi_t(RowIndex(1:M),:);%Select M rows randomly
    %normalization
    for ii = 1:N
        Phi(:,ii) = Phi(:,ii)/norm(Phi(:,ii));
    end

end

 

稀疏随机测量矩阵

function [ Phi ] = SparseRandomMtx( M,N,d )
%SparseRandomMtx Summary of this function goes here
% Generate SparseRandom matrix
%M -- RowNumber
%N -- ColumnNumber
%d -- The number of '1' in every column,d<M
%Phi -- The SparseRandom matrix

%% Generate SparseRandom matrix  
    Phi = zeros(M,N);
    for ii = 1:N
        ColIdx = randperm(M);
        Phi(ColIdx(1:d),ii) = 1;
    end

end

 

托普利兹测量矩阵

function [ Phi ] = ToeplitzMtx( M,N )
%ToeplitzMtx Summary of this function goes here
%Generate Toeplitz matrix
%M -- RowNumber
%N -- ColumnNumber
%Phi -- The Toeplitz matrix

%% Generate a random vector
%%(1)Gauss
% u = randn(1,2*N-1);
    %(2)Bernoulli
    u = randi([0,1],1,2*N-1);
    u(u==0) = -1;

%% Generate Toeplitz matrix  
    Phi_t = toeplitz(u(N:end),fliplr(u(1:N)));
    Phi = Phi_t(1:M,:);
end

 

循环测量矩阵

function [ Phi ] = CirculantMtx( M,N )
%CirculantMtx Summary of this function goes here
%Generate Circulant matrix
%M -- RowNumber
%N -- ColumnNumber
%Phi -- The Circulant matrix

%% Generate a random vector
 %(1)Gauss
 %  u = randn(1,N);
 %(2)Bernoulli
    u = randi([0,1],1,N);
    u(u==0) = -1;
%% Generate Circulant matrix  
    Phi_t = toeplitz(circshift(u,[1,1]),fliplr(u(1:N)));
    Phi = Phi_t(1:M,:);
end

 

posted @ 2020-02-19 13:59  In.the.peace  阅读(274)  评论(0编辑  收藏  举报