Info

此问题已关闭。 请重新打开它进行编辑或回答。

Outputing Array from Nested Why Loops

2 次查看(过去 30 天)
MiauMiau
MiauMiau 2015-4-28
关闭: MATLAB Answer Bot 2021-8-20
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 个评论
Stephen23
Stephen23 2015-4-29
Note that you should avoid using i and j for loop variable names, as these are both names of the inbuilt imaginary unit.

回答(3 个)

the cyclist
the cyclist 2015-4-28
编辑:James Tursa 2015-4-29
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 个评论
Stephen23
Stephen23 2015-4-29
编辑:Stephen23 2015-4-30
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 2015-4-28
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 2015-4-29
编辑:Stephen23 2015-4-30
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!

Translated by