# matlab - Generate all possible permutations for 2 vectors

I was wondering if there was a way to generate all possible permutations for 2 vectors. I know that I can use perms, but that just works for one vector.

What I would like is to input the vector [1 2 3]

and would get out

``V1 = [] V2 = [1 2 3]V1 = [1 2 3] V2 = []V1 = [1] V2 = [2 3]V1 = [2] V2 = [1 3]...``

Also could I store all of these permutations in a cell array becuase they all have different lengths so a Matrix won't work.

Is this what you want?

``````output = {};
v = [1 2 3];  % input
N = length(v);
for k=1:2^N
m = logical( bitget(k, 1:N) );  % mask selecting elements of v1
v1 = v(m);
v2 = v(~m);
output{end+1} = {v1, v2};
end
``````

In almost one line, the credit should go to seb though.

``````v = [1 2 3 4];
N = numel(v);

out = cellfun(@(x) {v(x) v(~x)}, mat2cell( logical( bsxfun(@bitget,(1:2^N)', (1:N)) ) ,ones(1,2^N),N) , 'uni', 0)
``````

My old answer, clumsy, but works:

``````A = arrayfun(@(x) nchoosek(V,x), 1:numel(V), 'uni',0);
B = cellfun(@(x) mat2cell(x,ones(1,size(x,1)),size(x,2)),A,'uni',0);

V1 = vertcat({[]},B{:});
V2 = cellfun(@(x) setdiff(V,x), V1, 'uni',0);
``````

gives:

``````>> celldisp(V1)

V1{1} =
[]
V1{2} =
1
V1{3} =
2
V1{4} =
3
V1{5} =
1     2
V1{6} =
1     3
V1{7} =
2     3
V1{8} =
1     2     3
``````

and for `V2` right the opposite.

Try the following solution:

``````a=num2cell(1:3);
output1=cellfun(@(x) nchoosek(1:3,x),a,'UniformOutput',false);
output_reverse=cellfun(@(x) nchoosek(3:-1:1,x),a(2:3),'UniformOutput',false);
``````

For a sequence of `1,2,3`, the output would be as follows:

``````output1{1}=

1
2
3

output1{2}=

1     2
1     3
2     3

output1{3}=

1     2     3
``````

Execute the `output_reverse` line only when you require the reverse combinations also. Hope this is what you are looking for.

Use a loop over all possible divisions. For each division, compute a mask (logical index) that tells which elements go to `V1` and which go to `V2`. The following assumes order is not important, i.e. `[1],[2 3]` is the same division as `[1], [3 2]`.

``````vector = [1 2 3]; %// example data
N = numel(vector); %// number of elements
NN = 2^N; %// number of results
V1 = cell(1,NN); %// intiallize
V2 = cell(1,NN); %// intiallize
for n = 0:NN-1;
mask = logical(dec2bin(n,N)-'0'); %// logical index for values in V1