How to generate pattern randomly In MATLAB
Afficher commentaires plus anciens
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
Réponse acceptée
Plus de réponses (2)
Davide Masiello
le 13 Mar 2022
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 commentaires
Med Future
le 13 Mar 2022
Med Future
le 13 Mar 2022
"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
le 13 Mar 2022
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
le 14 Mar 2022
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
le 14 Mar 2022
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
le 14 Mar 2022
Med Future
le 14 Mar 2022
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
le 14 Mar 2022
Rik
le 14 Mar 2022
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.
1 commentaire
Med Future
le 14 Mar 2022
Catégories
En savoir plus sur Creating and Concatenating Matrices dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



