use "for loop" for n times but n is not fixed
2 views (last 30 days)
Show older comments
hi
i have a problrm with "for loop"
consider that i only have 5 integers, say 1 2 3 4 5
if the input n=1
i will expect i will get a set of data [1] [2] [3] [4] [5]
if n=2
i will get
[1 1] [1 2] [1 3] [1 4] [1 5]
[2 1] [2 2] [2 3] [2 4] [2 5]
[3 1] [3 2] [3 3] [3 4] [3 5]
[4 1] [4 2] [4 3] [4 4] [4 5]
[5 1] [5 2] [5 3] [5 4] [5 5]
actually, i want to get all the permutations of a n-digit number which can take the value of 1 2 3 4 5 (in this case)
of course if i know the number of digits (say n=2), i can write a for loop like this
for i = 1:5
for j = 1:5
A = [i,j]
end
end
however, i would like to input n for any integers and then matlab will generate all the possible cases autometically
for example, if i input n = 2, i will get 25 results listed above
if i input n = 3, i will get 125 results...
thanks for the help
0 Comments
Answers (3)
Jan
on 4 Jan 2013
Edited: Jan
on 4 Jan 2013
If you want to find out, how to solve such question in general:
n = 5;
k = 3;
m = zeros(n^k, k);
v = ones(1, 3);
c = 0;
ready = false;
while ~ready
% Store current value in the output matrix:
c = c + 1;
m(c, :) = v;
% Increase the current value, care for overflow:
q = k;
while ~ready
v(q) = v(q) + 1;
if v(q) <= n
break; % Index inside limit, proceed with outer loop
end
v(q) = 1; % Reset current index to 1
q = q - 1; % Go to previous index
if q == 0 % All indices are exhausted
ready = true; % Stop both loops
end
end
end
By this way, you do not increase a scalar in a FOR loop, but the elements of a vector in a WHILE loop.
There are more efficient methods to create permutations. Exploiting the obvious structure of the output would be more efficient.
0 Comments
Daniel Shub
on 4 Jan 2013
I wouldn't do it this way, but recursion is a useful technique when you have an unknown number of loops.
function x = looper(n)
if n > 1
temp = looper(n-1);
x = [];
for ii = 1:5
x = [x; repmat(ii, length(temp), 1), temp];
end
else
x = (1:5)';
end
end
0 Comments
Andrei Bobrov
on 4 Jan 2013
v = 1:5;
n = 3;
a = cell(1,n);
[a{:}] = ndgrid(v);
out = cell2mat(cellfun(@(x)x(:),a,'un',0));
0 Comments
See Also
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!