Info

This question is closed. Reopen it to edit or answer.

Outputing Array from Nested Why Loops

1 view (last 30 days)
MiauMiau
MiauMiau on 28 Apr 2015
Closed: MATLAB Answer Bot on 20 Aug 2021
Hi, The purpose of my code is to save for a number n, say 3, the following in an array A:
A(1) = randi(3)
A(2) = randi(2)
A(3) = randi(1)
A(4) = randi(3)
A(5) = randi(2)
....
I have written the following code, but right now it is not doing what I want - how can I change that?
function [ArrayFinal] = RandomizeTrials(numberofSeq, lengthofArray)
ArrayFinal = zeros(1,lengthofArray)
i = 1;
while i < lengthofArray+1
while i < numberofSeq+1
Array(i) = randi(numberofSeq);
numberofSeq = numberofSeq-1;
i = i + 1;
end
i+3;
end
end
  1 Comment
Stephen23
Stephen23 on 29 Apr 2015
Note that you should avoid using i and j for loop variable names, as these are both names of the inbuilt imaginary unit.

Answers (3)

the cyclist
the cyclist on 28 Apr 2015
Edited: James Tursa on 29 Apr 2015
There were lots of little issues with your code. I hope this was not homework, because I tried to pretty much fix them all:
function [Array] = RandomizeTrials(numberofSeq, lengthofArray)
Array = zeros(1,lengthofArray);
i = 1;
while i < lengthofArray+1
n=1;
while n < numberofSeq+1
Array(i) = randi(numberofSeq+1-n);
n = n + 1;
i = i + 1;
end
i+numberofSeq;
end
end
  8 Comments
Stephen23
Stephen23 on 29 Apr 2015
Edited: Stephen23 on 30 Apr 2015
Because j-1 does not allocate that new values to anything. MATLAB does not have a short-hand for incrementing/decrementing variables, so you need to explicitly assign that value: j = j-1

Søren Jensen
Søren Jensen on 28 Apr 2015
A(1) = randi(3)
A(2) = randi(2)
A(3) = randi(1)
A(4) = randi(3)
A(5) = randi(2)
so you have a minimum bound where the argument for randi resets, or is it reset when it hith the floor (1)?
anyways, using i for both loops should overwrite each other and mess up your intention i think. try this:
saved = numberofSeq; % saved for use in the outer itteration i = 1;
while i<(lengthofArray+1)
numberofSeq = saved;
for k=1:(numberofSeq+1)
Array((i-1)*numberofSeq+k) = randi(numberofSeq);
numberofSeq = numberofSeq-1;
end i=i+numberofSeq;
end
% you seem to be adapt in other coding languages, so you can probably guess my intention.. unless i missed yours

Stephen23
Stephen23 on 29 Apr 2015
Edited: Stephen23 on 30 Apr 2015
It is possible to vectorize this code a bit by using randi to generate vectors instead of many separate scalar values: this will likely be faster generally, and certainly if out_len/num_seq is a large value.
function out = RandomizeTrials(num_seq, out_len)
X = max(2,ceil(out_len/num_seq));
for k = num_seq:-1:1
out(k,:) = randi(num_seq-k+1,1,X);
end
out = out(1:out_len);
end

Community Treasure Hunt

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

Start Hunting!