How to generate pattern randomly In MATLAB

3 views (last 30 days)
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

Accepted Answer

Davide Masiello
Davide Masiello on 14 Mar 2022
Edited: Davide Masiello on 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 Comments
Med Future
Med Future on 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 on 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');

Sign in to comment.

More Answers (2)

Davide Masiello
Davide Masiello on 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 Comments
Med Future
Med Future on 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 on 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

Sign in to comment.


Steven Lord
Steven Lord on 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 Comment
Med Future
Med Future on 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

Sign in to comment.

Categories

Find more on Creating and Concatenating Matrices in Help Center and File Exchange

Products


Release

R2021b

Community Treasure Hunt

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

Start Hunting!