38 views (last 30 days)
Show older comments
Ryan about 15 hours ago
Commented: Ryan about 14 hours ago
Accepted Answer: John D'Errico
Hello,
I am attempting to generate an array with non-linear spacing between the elements but struggling to figure out a way to impliment this. I need an array x of points spaced from a real, negative value a to a real, positive value b. Ideally the spacing should follow a Gaussian distribution such that many points are clustered about x=0 in the vicinity of some finite width d. Conversely the spacing should be large at the boundaries. More generally it doesn't have to be Gaussian but some guidance on a scheme where I can specify a length d<<|b-a| across which many points should be distributed would be really appreciated.
I tried to work out an algorithm of sorts from pen and paper but it didn't really work and resulted in something that did not appear to be immediately solveable.
Thanks
0 Comments Show -2 older commentsHide -2 older comments
Show -2 older commentsHide -2 older comments
Sign in to comment.
Sign in to answer this question.
Accepted Answer
John D'Errico about 6 hours ago
Edited: John D'Errico about 6 hours ago
It sounds like you want a deterministic, non-random set of points. You can use the inverse gaiussian CDF to do what you want.
a = -2.5;
b = 3;
N = 40;
x = norminv(linspace(normcdf(a),normcdf(b),N));
xline(x,'r')
So most dense at zero, and a density that drops off away from there. I chose limits that are not centered around zero, but had they been centered, the set would be perfectly symmetric.
Of course, you can adjust the speed of fall off, by use of a different variance on the implicit Gaussian.
1 Comment Show -1 older commentsHide -1 older comments
Show -1 older commentsHide -1 older comments
Ryan about 6 hours ago
Direct link to this comment
https://www.mathworks.com/matlabcentral/answers/2145269-how-to-generate-vector-with-non-linear-spacing#comment_3237069
Yes that's looking exactly like what I need, thanks so much!
Sign in to comment.
More Answers (2)
Matt J about 6 hours ago
Edited: Matt J about 6 hours ago
Open in MATLAB Online
a=-1;
b=+1;
d=1/(b-a)^2;
y=d*randn(1,500);
x=sort(y+(a+b)/2);
stem(x,x.^0); xlim([a,b])
2 Comments Show NoneHide None
Show NoneHide None
Ryan about 6 hours ago
Direct link to this comment
https://www.mathworks.com/matlabcentral/answers/2145269-how-to-generate-vector-with-non-linear-spacing#comment_3237029
Thanks for the suggestion, this is a possible option. Any way to get the spacing more regular?
Ryan about 6 hours ago
Direct link to this comment
https://www.mathworks.com/matlabcentral/answers/2145269-how-to-generate-vector-with-non-linear-spacing#comment_3237054
Ah I see what I meant by Gaussian is not in the sense of a random distribution but of a spacing that followed a pattern akin to a contiunous Gaussian function. I had envisaged an algorithm that produces regular values
Where Δis some constant. I don't think this algorithm "works" as such but I think it illustrates what I'm after. For what I am working on a random distribution may also work.
Sign in to comment.
Aquatris about 6 hours ago
Open in MATLAB Online
The answer from another question here:
A = 1;
B = 5;
std = .9; % need to play with this to get desired shape within desired range,
% if too high, it does not become a normal distribution
% if too low, it does not cover the whole A-B range
mean = 3;
step1Result = mean + std * randn(1e3,1); % create random data with mean and std
step2Result = min(max(step1Result,A),B); % make sure they end up in A-B range
hist(step2Result)
ylabel('# of occurence')
xlabel('Data Value')
0 Comments Show -2 older commentsHide -2 older comments
Show -2 older commentsHide -2 older comments
Sign in to comment.
Sign in to answer this question.
An Error Occurred
Unable to complete the action because of changes made to the page. Reload the page to see its updated state.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- Deutsch
- English
- Français
- United Kingdom(English)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)
Contact your local office