|
|
Re: Generate random numbers with fixed sum and different constraints
Posted:
Nov 19, 2012 1:39 AM
|
|
Sorry, I miss the definition of the variable 'tol' in my previous posted code; here we go again:
% lower + upper bounds lo = [1 0 2 1 0]; up = [5 6 4 4 2]; % target sum s = 15; % number of samples n = 1000;
%% Engine m = length(lo); slo = sum(lo); sup = sum(up);
% A particular solution, x0 x0 = interp1([slo; sup], [lo; up], s); if any(isnan(x0)) error('no solution exists') end
% feasible set: S = { x=x0+A*y : A*y <= b } x0 = x0(:); B = null(ones(size(lo))); A = [-B; B]; b = [x0-lo(:); up(:)-x0];
% FEX: http://www.mathworks.com/matlabcentral/fileexchange/30892 tol = 1e-6; [V,nr,nre] = lcon2vert(A,b,[],[],tol);
% Split S in simplex T = delaunayn(V); P = V(T,:); P = reshape(P, [size(T) m-1]); P = permute(P, [3 2 1]); np = size(P,3);
% Compute the volume of simplexes Q = bsxfun(@minus, P, P(:,end,:)); Q(:,end,:) = []; vol = arrayfun(@(k) det(Q(:,:,k)), 1:np); vol = abs(vol);
% generate n samples (i) of v with probability ~ vol vol = vol / sum(vol); c = cumsum(vol); c(end)=1; [~, i] = histc(rand(1,n),[0 c]);
% Random rarycentric coordinates % FEX: http://www.mathworks.com/matlabcentral/fileexchange/9700 w = randfixedsum(m,n,1,0,1);
% Put together V = P(:,:,i); y = zeros(m-1, n); for k=1:n y(:,k) = V(:,:,k)*w(:,k); end % final result, m x n array of random vector x = bsxfun(@plus, x0, B*y);
% Bruno
|
|