ivan@154: function [A] = generate_matrix(M, N, ensemble, p) ivan@154: % ========================================================================= ivan@154: % Measerement matrix generator ivan@154: % ========================================================================= ivan@154: % INPUT ARGUMENTS: ivan@154: % M Number of measurements (number of rows). ivan@154: % N Size of sparse vector (number of columns). ivan@154: % ensemble Ensemble type of measurement matrix. Possible ivan@154: % values are: ivan@154: % -'Gaussian': creates a MxN measurement matrix with ivan@154: % elements drawn from normal distribution N(0,1).% ivan@154: % -'Bernoulli': creates a MxN measurement matrix with ivan@154: % elements drawn from Bernoulli distribution (1/2,1/2). ivan@154: % -'pBernoulli': creates a MxN measurement matrix with ivan@154: % elements drawn from Bernoulli distribution (p,1-p). ivan@154: % Parameter of Bernoulli distribution. ivan@154: % -'sparseGaussian': creates a MxN sparse measurement ivan@154: % matrix with elements drawn from normal distribution N(0,1). ivan@154: % ========================================================================= ivan@154: % OUTPUT ARGUMENTS: ivan@154: % A MxN measurement matrix with normalized columns. ivan@154: % ========================================================================= ivan@154: % 01/04/2011, by Anastasios Kyrillidis. anastasios.kyrillidis@epfl.ch, EPFL. ivan@154: % ========================================================================= ivan@154: if nargin < 3 ivan@154: ensemble = 'Gaussian'; ivan@154: end; ivan@154: ivan@154: if nargin < 4 ivan@154: p = 0.5; ivan@154: end; ivan@154: ivan@154: switch ensemble ivan@154: case 'Gaussian' ivan@154: A = randn(M,N); % Standard normal distribution ivan@154: for i = 1:N % Normalize columns ivan@154: A(:,i) = A(:,i)/norm(A(:,i)); ivan@154: end; ivan@154: case 'Bernoulli' ivan@154: A = (-1).^round(rand(M,N)); % Bernoulli ~ (1/2, 1/2) distribution ivan@154: for i = 1:N % Normalize columns ivan@154: A(:,i) = A(:,i)/norm(A(:,i)); ivan@154: end; ivan@154: case 'pBernoulli' ivan@154: A = (-1).^(rand(M,N) > p); % Bernoulli ~ (p, 1-p) distribution ivan@154: for i = 1:N % Normalize columns ivan@154: A(:,i) = A(:,i)/norm(A(:,i)); ivan@154: end; ivan@154: case 'sparseGaussian' ivan@154: leftd = 8; ivan@154: A = zeros(M,N); ivan@154: for i = 1:N ivan@154: ind = randperm(M); ivan@154: A(ind(1:leftd),i)=1/leftd; ivan@154: end ivan@154: for i = 1:N % Normalize columns ivan@154: A(:,i) = A(:,i)/norm(A(:,i)); ivan@154: end; ivan@154: end;