# Generating an "all-combinations" matrix for a given vector

1 view (last 30 days)
Burak on 7 Nov 2016
Edited: Andrei Bobrov on 8 Nov 2016
Hi,
Given a column vector with integer values, say x = [2;3;4], I would like to create a 3*24 matrix of the following form
Each column in A is created by selecting 1st, 2nd and 3rd elements of the corresponding column from sets {1,2}, {1,2,3} and {1,2,3,4}, respectively. Thus, 2*3*4=24 different columns can be generated using this approach to form matrix A.
I am aware that the number of columns in matrix A grows very fast with the size of vector x and numeric values of its elements. But I won't be working with examples of matrix A larger than 500 cloumns.
-burak

Thorsten on 7 Nov 2016
x = [2 3 4];
n = prod(x);
for i = 1:numel(x)
li = []; for ii = 1:x(i), li = [li repmat(ii, [1 n/prod(x(1:i))])]; end,
A(i,:) = repmat(li, [1 n/numel(li)]);
end
Burak on 7 Nov 2016
Edited: Burak on 7 Nov 2016
This one works fine for my purpose. Thank you so much.

Andrei Bobrov on 7 Nov 2016
Edited: Andrei Bobrov on 8 Nov 2016
A = fullfact(x(end:-1:1));
A = flip(A,2)';
other way :)
x = [2 3 4]';
k = arrayfun(@(ii)1:ii,x(end:-1:1),'un',0);
[a,b,c] = ndgrid(k{:});
A = [c(:),b(:),a(:)]';
Burak on 8 Nov 2016
I knew there was a built-in function for it. Thanks.

KSSV on 7 Nov 2016
clc; clear all ;
v1 = [1 2] ;
v2 = [1 2 3] ;
v3 = [1 2 3 4] ;
%
dimensions = cellfun(@numel, {v1,v2,v3});
[i1,i2,i3] = ind2sub(dimensions, 1:prod(dimensions));
combinations = [v1(i1); v2(i2); v3(i3)]
Burak on 7 Nov 2016
Thanks for the help. Though it works fine for the given instance,it requires to add a new i variable for each additional element in vector x.