How to generate pattern randomly In MATLAB

11 visualizzazioni (ultimi 30 giorni)
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

Risposta accettata

Davide Masiello
Davide Masiello il 14 Mar 2022
Modificato: Davide Masiello il 14 Mar 2022
This is another approach based on the comments under my previous answer.
It tries to implement the request by @Med Future that: it generate the the output y which is equal to number of levelsx1000 for eg. 10 level then shape is 10x1000. but i want the same 10x1000 into single row 1x1000 to generate that shape.
To be fair, I am still not sure this is what @Med Future is trying to achieve, but it might be worth a shot.
NOTE: the code below implements the routine by @Image Analyst to compute random values which have a minimum spacing requirement.
clear,clc
numRequired = randi(16,1,1); % 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
x = 1:1000;
y = repelem(y,floor(length(x)/length(y)));
% completes y up to 1000 values by repeating the start of y
if length(y) < 1000
y(end+1:1000) = y(1:1000-end);
end
plot(x,y,'-ob');
  2 Commenti
Med Future
Med Future il 14 Mar 2022
  • @Davide Masiello you are doing great job Sir, this method is good, but shape of the pattern is change.
  • The pattern shape should be like above which i have shared.
  • rest of the method is what i wanted.
Davide Masiello
Davide Masiello il 14 Mar 2022
So this?
clear,clc
numRequired = randi(16,1,1); % 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
x = 1:1000;
y = ones(size(x)).*y';
plot(x,y,'-ob');

Accedi per commentare.

Più risposte (2)

Davide Masiello
Davide Masiello il 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 Commenti
Med Future
Med Future il 14 Mar 2022
@Rik like you mention 16 levels, right , i want these 16 levels to be random , like sometime i get 14 sometime i get 4, levels should be random from 2 to 16
Rik
Rik il 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

Accedi per commentare.


Steven Lord
Steven Lord il 14 Mar 2022
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
yy = 1×12
1 2 3 1 2 3 1 2 3 1 2 3
If so use the repmat function.
yy2 = repmat(y, 1, 4)
yy2 = 1×12
1 2 3 1 2 3 1 2 3 1 2 3
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
yy3 = 1×12
3 2 2 2 2 1 2 3 3 3 2 1
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)
yy4 = 1×12
1 3 2 3 2 1 3 3 2 1 1 2
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 Commento
Med Future
Med Future il 14 Mar 2022
@Steven Lord The first apporach, yy2 = repmat(y, 1, 4)
  • I want random levels 2 to 16,
  • then i want random values which is 30 to 40% away from the next value for example one values is 951 the next should be 990.
  • Then Repeat the matrix to complete 1000 samples .
  • First row consists of one pattern upto 1000 pattern to complete shape of 1000x1000

Accedi per commentare.

Categorie

Scopri di più su Loops and Conditional Statements in Help Center e File Exchange

Prodotti


Release

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by