how to generate cell array based on the size of it.

3 views (last 30 days)
My command is B = arrayfun(@(N) randi(2,1,N), repelem((1:3).',5), 'uniform', 0)
when i run it generates B= 15×1 cell array
{[ 2]}
{[ 1]}
{[ 3]}
{[ 3]}
{[ 2]}
{1×2 double}
{1×2 double}
{1×2 double}
{1×2 double}
{1×2 double}
{1×3 double}
{1×3 double}
{1×3 double}
{1×3 double}
{1×3 double}
but the values inside the array are
1
1
2
1
2
[2,1]
[2,1]
[1,2]
[2,2]
[1,1]
[2,2,1]
[1,2,1]
[2,2,2]
[1,1,1]
[2,1,2]
Actually i need to get
1
1
3
1
1
for first 5 rows the value should be 1 as it is 1x1 double
[1,2]
[2,1]
[3,2]
[3,2]
[2,1]
for the next 5 rows the values should be 1,2 and not more than 2, and should not have 2 by leaving 1
[1,2,1]
[3,1,3]
[2,3,3]
[1,2,2]
[3,3,1]
for the next 5 rows the values should not have 3 by leaving 2 and should not have 2 by leaving 1.
Could anyone please help me with this.

Accepted Answer

Mohammad Sami
Mohammad Sami on 24 Jun 2021
I am bit confused what you mean by should not have 3 by leaving 2 and should not have 2 by leaving 1.
I assume you just want the numbers in order 1,2,3.
B = arrayfun(@(N) colon(1,N), repelem((1:3).',5), 'UniformOutput', false)
B = 15×1 cell array
{[ 1]} {[ 1]} {[ 1]} {[ 1]} {[ 1]} {[ 1 2]} {[ 1 2]} {[ 1 2]} {[ 1 2]} {[ 1 2]} {[1 2 3]} {[1 2 3]} {[1 2 3]} {[1 2 3]} {[1 2 3]}
  11 Comments
jaah navi
jaah navi on 5 Jul 2021
Thanks it works. Also, I would like to check the following issue.
Based on the above command
A = arrayfun( @my_rand, repelem((1:5).',300)', 'UniformOutput', false);
function seq = my_rand(N)
if N == 1
seq = 1;
return;
end
max = randi(N);
s1 = randperm(max);
s2 = randi(max,1,N-max);
seq = [s1 s2];
seq = seq(randperm(N));
end
B = arrayfun( @my_rand, repelem((1:5).',300)', 'UniformOutput', false);
function seq = my_rand(N)
if N == 1
seq = 1;
return;
end
max = randi(N);
s1 = randperm(max);
s2 = randi(max,1,N-max);
seq = [s1 s2];
seq = seq(randperm(N));
end
Here, I am having two array A and B
when I run the code i can get the A and B
But the difference between A and B is very large. As 900 array are created for A and B is there any way to create the maximum number same values in both A and B. For example 800 array should be generated as equal and the rest 100 can be different. could you please help me on it.
Mohammad Sami
Mohammad Sami on 6 Jul 2021
You can simply generate A or another variable. Then you can use randperm to sample A to get B. For example if you have an array of 20 values and you want to choose 10, you can do like this.
if true
A = 1:2:40;
B = A(randperm(20,10));
end

Sign in to comment.

More Answers (1)

jaah navi
jaah navi on 15 Jul 2021
The following code executes as per required.
A = arrayfun( @my_rand, repelem((1:24).',500), 'UniformOutput', false);
function seq = my_rand(N)
if N == 1
seq = 1;
return;
end
max = randi(N);
s1 = randperm(max);
s2 = randi(max,1,N-max);
seq = [s1 s2];
seq = seq(randperm(N));
seq = sort(seq);
end
But in addition I want the above code to execute
10x1 double, 10x2 double, 10x3 double,......, 10x24 double instead 1x1 double, 1x2 double, 1x3 double,......, 1x24 double.
Could you please help me on this.

Categories

Find more on Structures in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!