Quantcast
Channel: MATLAB Central Newsreader Recent Posts
Viewing all articles
Browse latest Browse all 19628

Re: Generate random numbers with fixed sum and different constraints

$
0
0
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

Viewing all articles
Browse latest Browse all 19628

Trending Articles