How to automatically introduce a nested layer of for-loop?

14 views (last 30 days)
Wh Khu on 26 Feb 2019
Answered: Shunichi Kusano on 26 Feb 2019
Given a set of x-values , I want to create a script that generates a product of n numbers.
For example, if I want to generate products of 2 numbers, i.e. and so on, the script would be:
for i_1=1:3
for i_2=1:3
Product=X(i_1)*X(i_2)
end
end
There will be 2 for-loops, one nested in another.
If I want to generate products of 3 numbers, i.e. and so on, the script would be:
for i_1=1:3
for i_2=1:3
for i_3=1:3
Product=X(i_1)*X(i_2)*X(i_3)
end
end
end
There will be 3 for-loops, i.e. 2 nested loops in an external loop.
Is there a way to automate this, like a recursion, so when n increases, it will automatically introduce a nested for-loop in the original script? The concept is like this:
n=n
for i_1=1:3
for i_2=1:3
for i_3=1:3
.
.
.
for i_n=1:3
Product=X(i_1)*X(i_2)*X(i_3)*...*X(i_n)
end
.
.
.
end
end
end

Yasasvi Harish Kumar on 26 Feb 2019
The Product variable gets over written in each iteration. I dont see why you would have a loop for it.
If you still need to write multiple loops, try recursive function as a solution.
Wh Khu on 26 Feb 2019
I know my Product will get overwritten for every loop, so I'm gonna store it into a cell for each iteration, it's just that I don't want to include that unrelated intricacy in my example above because that's not the point. I want to simplify the bigger picture, which is to add nested for-loops automatically based on the number n I assign.

Shunichi Kusano on 26 Feb 2019
Hi, This is a possibility:
N = 4; % the loop number
X = rand(1,3); % simulated X
products = ones(ones(1,N)*3);
reshape_arr = [3 ones(1,N-1)];
repmat_arr = [1 ones(1,N-1)*3];
for i = 1:N
temp = repmat(reshape(X, circshift(reshape_arr, i-1)), circshift(repmat_arr,i-1));
products = products .* temp;
end
hope this helps.