how to make random vector with a certain profile
显示 更早的评论
Well, im looking for a way to produce a random vector that behave like the profile in the picture.
It needs to start from let's say around 2, then climbs up to a max value not higher than 20, and then drops to zero.
That is the general idea, the distribution doesnt have to be exactly like in the graph.
does anyone have a good idea how to make that happened?
2 个评论
Walter Roberson
2020-7-21
Do you happen to have the data for that plot available? Rather than us having to read it off the graph and enter the values by hand.
samuel
2020-7-21
回答(2 个)
Bruno Luong
2020-7-21
编辑:Bruno Luong
2020-7-21
r=linspace(0,1.5);
fv=(1.5-r).*(2+10*exp(-((r-1)./0.3).^2)); % whatever unnormaized pdf
% NOTE: This method assumes r is an equidistance vector
% otherwise you need to multiply fv by dr before cumulative sum
c = cumsum(fv);
c=(c-c(1))/(c(end)-c(1));
[cu,loc] = unique(c);
rs=r(loc);
x=interp1(cu, rs, rand(1,1e6)); % your random vector
% Check
subplot(2,1,1);
plot(r,fv);
subplot(2,1,2);
hist(x,100)

5 个评论
Walter Roberson
2020-7-21
What is c?
Bruno Luong
2020-7-21
just edit with c calculation
samuel
2020-7-21
Bruno Luong
2020-7-21
If you want change for different pdf fv then change it, it in the line #1 & 2 of my code example.
samuel
2020-7-21
Bruno Luong
2020-7-21
编辑:Bruno Luong
2020-7-21
Modified code in case r is not equidistance (but monotonic)
rmid = 0.5*(r(1:end-1) + r(2:end));
dr = r(2:end)-r(1:end-1);
fvfun = @(r)(1.5-r).^3.*(2+50*exp(-((r-1)./0.3).^2)); % whatever
fv = fvfun(rmid);
c = cumsum(fv.*dr);
c = [0, c]/c(end);
[cu, loc] = unique(c);
x = interp1(cu, r(loc), rand(1,1e6));
类别
在 帮助中心 和 File Exchange 中查找有关 Random Number Generation 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!