How to generate pattern randomly In MATLAB

3 Ansichten (letzte 30 Tage)
Med Future
Med Future am 13 Mär. 2022
Kommentiert: Davide Masiello am 14 Mär. 2022
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

Akzeptierte Antwort

Davide Masiello
Davide Masiello am 14 Mär. 2022
Bearbeitet: Davide Masiello am 14 Mär. 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 Kommentare
Med Future
Med Future am 14 Mär. 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 am 14 Mär. 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');

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Davide Masiello
Davide Masiello am 13 Mär. 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 Kommentare
Med Future
Med Future am 14 Mär. 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 am 14 Mär. 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

Melden Sie sich an, um zu kommentieren.


Steven Lord
Steven Lord am 14 Mär. 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 Kommentar
Med Future
Med Future am 14 Mär. 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

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Creating and Concatenating Matrices finden Sie in Help Center und File Exchange

Produkte


Version

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by