How to generate pattern randomly In MATLAB
显示 更早的评论
Hello Everyone, I hope you are doing well.
I have the following pattern , i want to generate this pattern randomly in Matlab.
Y axis values is upto 1000 and and X axis values is also 1000 ( thousand samples) ignore the 0.1 value
The current plot has three levels, i want this levels upto 16 which is generated randomly
for example i have three levels then i have three values which are repeated to complete 1000 samples like the plot below.
can anybody please help me
采纳的回答
更多回答(2 个)
Davide Masiello
2022-3-13
clear,clc
n = 16; % Number of levels
L = randi(1000,n,1); % Level values
x = 1:1000;
y = ones(size(x)).*L;
plot(x,y,'-ob');

12 个评论
Med Future
2022-3-13
Med Future
2022-3-13
"i want random levels upto 16," <= then make n random.
n = randi(16, 1, 1) % Number of levels anywhere from 1 to 16
Med Future
2022-3-13
You can make them separated by a min separation like this. You can generate a trial y value and then get the distance to all the other y values and if it's far enough away, keep it, otherwise try a new y value.
numRequired = 11; % However many y values you require.
y = zeros(1, numRequired);
minSpacing = 30; % Whatever.
maxIterations = 100000; % Way more than you think you'll ever need. Failsafe to prevent infinite loop.
loopCounter = 1; % Number of times the loop goes. includes keepers and rejects.
counter = 1; % Index of y
while counter <= numRequired && loopCounter < maxIterations
trial_y = 1000 * rand;
distances = abs(y - trial_y);
if min(distances) > minSpacing
% It's far enough away so keep it.
y(counter) = trial_y;
counter = counter + 1;
end
loopCounter = loopCounter + 1;
end
y = sort(y)
Davide Masiello
2022-3-14
The code share above the output y shape depend on number of level for example if i have 10 levels the shape is 10x1000. but i want that 10x1000 in a single row. 1x1000.
and generate a random data which have 1000 rows and each rows have this kind of pattern with different levels.
Could you try to explai this a bit better?
When you say that you want a 10x1000 matrix in a single 1x1000 raw, I am not sure what you mean.
Rik
2022-3-14
You wanted randomly generated values that were sufficiently spaced, that is the result that Image Analyst provided. This code essentially generates the L variable from the original answer, but calls it y instead.
Med Future
2022-3-14
Med Future
2022-3-14
Look at the x-axis. There are exactly 16 values there. You wanted 16 random levels. The code Image Analyst wrote for you has 16 numbers as a result. What is your problem? You only need to use his code to generate the L matrix in the code Davide wrote for you:
n = 16; % Number of levels
L = GenerateLevels(n,30); % Level values
L=L(:);
x = 1:1000;
y = ones(size(x)).*L;
plot(x,y,'-ob');
function y=GenerateLevels(numRequired,minSpacing)
% numRequired : However many y values you require.
% minSpacing : Whatever.
y = zeros(1, numRequired);
maxIterations = 100000; % Way more than you think you'll ever need. Failsafe to prevent infinite loop.
loopCounter = 1; % Number of times the loop goes. includes keepers and rejects.
counter = 1; % Index of y
while counter <= numRequired && loopCounter < maxIterations
trial_y = 1000 * rand;
distances = abs(y - trial_y);
if min(distances) > minSpacing
% It's far enough away so keep it.
y(counter) = trial_y;
counter = counter + 1;
end
loopCounter = loopCounter + 1;
end
y = sort(y);
end
See?
Also, you said you wanted random numbers. How can random numbers be equally spaced?
Med Future
2022-3-14
Rik
2022-3-14
Image Analyst also already provided that code for you:
n = randi(16, 1, 1) % Number of levels anywhere from 1 to 16
You can easily change that range to 2 to 16 like this:
n = 1 + randi(15, 1, 1) % Number of levels anywhere from 2 to 16
So to clarify you have a vector of y values:
y = [1 2 3];
that you want to repeat over and over to give a pattern like:
yy = [1 2 3 1 2 3 1 2 3 1 2 3] % etc
If so use the repmat function.
yy2 = repmat(y, 1, 4)
If instead you want each element of the resulting vector to contain one of the values from y chosen at random you can use the randi function.
n = numel(y);
ind = randi(n, 1, 12); % A 1-by-12 vector of random integers between 1 and n
yy3 = y(ind) % Use them as indices into y
Or if you want each element of y to be represented equally often, use randperm to shuffle the elements of yy2.
order = randperm(numel(yy2));
yy4 = yy2(order)
histogram(yy4) % Show the uniform distribution
If you mean something else, please describe in more detail what data you start with and what your ultimate goal is.
类别
在 帮助中心 和 File Exchange 中查找有关 Particle & Nuclear Physics 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



