ivan@154: function [x] = generate_vector(N, K, ensemble, sigma, p) ivan@154: % ========================================================================= ivan@154: % Sparse vector generator ivan@154: % ========================================================================= ivan@154: % INPUT ARGUMENTS: ivan@154: % N Size of sparse vector. ivan@154: % K Sparsity of vector. ivan@154: % ensemble Ensemble type of measurement matrix. Possible ivan@154: % values are: ivan@154: % -'Gaussian': K non-zero elements of the sparse vector ivan@154: % are drawn from normal distribution N(0,1). ivan@154: % -'sGaussian': K non-zero elements of the sparse vector ivan@154: % are drawn from normal distribution N(0,sigma^2). ivan@154: % -'Bernoulli': K non-zero elements of the sparse vector ivan@154: % are drawn from Bernoulli distribution (1/2,1/2). ivan@154: % -'pBernoulli': K non-zero elements of the sparse vector ivan@154: % are drawn from Bernoulli distribution (p,1-p). ivan@154: % sigma Standard deviation of Gaussian distribution. ivan@154: % p Parameter of Bernoulli distribution. ivan@154: % ========================================================================= ivan@154: % OUTPUT ARGUMENTS: ivan@154: % x K-sparse vector. ivan@154: % ========================================================================= ivan@154: % 01/04/2011, by Anastasios Kyrillidis. anastasios.kyrillidis@epfl.ch, EPFL. ivan@154: % ========================================================================= ivan@154: ivan@154: if nargin < 3 ivan@154: ensemble = 'Gaussian'; ivan@154: end; ivan@154: ivan@154: if nargin < 4 ivan@154: sigma = 1; ivan@154: p = 0.5; ivan@154: end; ivan@154: ivan@154: x = zeros(N,1); ivan@154: rand_indices = randperm(N); ivan@154: ivan@154: switch ensemble ivan@154: case 'Gaussian' ivan@154: x(rand_indices(1:K)) = randn(K,1); % Standard normal distribution ~ N(0,1) ivan@154: case 'sGaussian' ivan@154: x(rand_indices(1:K)) = sigma*randn(K,1); % Normal distribution ~ N(0,sigma^2) ivan@154: case 'Uniform' ivan@154: x(rand_indices(1:K)) = rand(K,1); % Uniform [0,1] distribution ivan@154: case 'Bernoulli' ivan@154: x(rand_indices(1:K)) = (-1).^round(rand(K,1)); % Bernoulli ~ (1/2, 1/2) distribution ivan@154: case 'pBernoulli' ivan@154: x(rand_indices(1:K)) = (-1).^(rand(K,1) > p); % Bernoulli ~ (p, 1-p) distribution ivan@154: end; ivan@154: ivan@154: x = x/norm(x);