File Exchange

## allcomb(varargin)

version 4.1 (4.35 KB) by

All combinations of input (v4.1, feb 2016)

4.73684
36 Ratings

Updated

Editor's Note: This file was a File Exchange Pick of the Week

ALLCOMB - All combinations
B = ALLCOMB(A1,A2,A3,...,AN) returns all combinations of the elements
in the arrays A1, A2, ..., and AN. B is P-by-N matrix is which P is the product
of the number of elements of the N inputs. This functionality is also
known as the Cartesian Product. The arguments can be numerical and/or
characters, or they can be cell arrays.

Examples:
allcomb([1 3 5],[-3 8],[0 1]) % numerical input:
% -> [ 1 -3 0
% 1 -3 1
% 1 8 0
% ...
% 5 -3 1
% 5 8 1 ] ; % a 12-by-3 array

allcomb('abc','XY') % character arrays
% -> [ aX ; aY ; bX ; bY ; cX ; cY] % a 6-by-2 character array

allcomb('xy',[65 66]) % a combination
% -> ['xA' ; 'xB' ; 'yA' ; 'yB'] % a 4-by-2 character array

allcomb({'hello','Bye'},{'Joe', 10:12},{99999 []}) % all cell arrays
% -> { 'hello' 'Joe' [99999]
% 'hello' 'Joe' []
% 'hello' [1x3 double] [99999]
% 'hello' [1x3 double] []
% 'Bye' 'Joe' [99999]
% 'Bye' 'Joe' []
% 'Bye' [1x3 double] [99999]
% 'Bye' [1x3 double] [] } ; % a 8-by-3 cell array

ALLCOMB(..., 'matlab') causes the first column to change fastest which
is consistent with matlab indexing. Example:
allcomb(1:2,3:4,5:6,'matlab')
% -> [ 1 3 5 ; 1 4 5 ; 1 3 6 ; ... ; 2 4 6 ]

If one of the arguments is empty, ALLCOMB returns a 0-by-N empty array.

and nchoose, combn, kthcombn (matlab Central FEX)

Stephen Cobeldick

### Stephen Cobeldick (view profile)

oops, I just needed to sort the output rows and it makes sense. Ignore my last comment!

Stephen Cobeldick

### Stephen Cobeldick (view profile)

Judging by its output, surely this submission is actually ALLPERM ? For exactly the same reasons as per your PERMN submission: https://www.mathworks.com/matlabcentral/fileexchange/7147-permn-v--n--k-

Jos (10584)

### Jos (10584) (view profile)

@Mendi Barel: You can use simple comma-separated list expansion for this:
C = {[1 2],[1 2 3],[5 6]})
allcomb(C{:})

Mendi Barel

### Mendi Barel (view profile)

Great. Better to add support for dynamic size pf vectors. For example this kind of input:

allcomb({[1 2],[1 2 3],[5 6]})

Christoffer Højrup

### Christoffer Højrup (view profile)

Hello everybody, I have submitted a question regarding this function at Matlab's question section. Please feel free to have a look at: https://uk.mathworks.com/matlabcentral/answers/325965-erroneous-input-into-the-allcomb-function
I am having trouble with the input.
Sincerely,
Christoffer

vcmorini

Eugenio

### Eugenio (view profile)

This is like combntns, very useful. I don't know why matlab developer removed it from the library.

Thanks!

Greatings

Marcin Konowalczyk

YS

Mihir Shah

Janik

midhun

### midhun (view profile)

Is it possible to set a constraint. I mean each combination in A should satisfy a condition. If

A= 0 0
1 0
2 0
0 1
1 1
2 1
0 2
1 2
2 2
0 3
1 3
2 3

Then I need only a combination that satisfies
B*A'=constant (for some matrix B).

If I generate all combination for 20 vectors using combvec, I am getting around 400,000 combinations, But I need only 200 of them which satisfies my condition.

Is it possible to pass a matrix as input argument to allcomb so that the input arguments are columns of matrix?...

midhun

### midhun (view profile)

Is it possible to set a constraint. I mean each combination in A should satisfy a condition. If

A= 0 0
1 0
2 0
0 1
1 1
2 1
0 2
1 2
2 2
0 3
1 3
2 3

Then I need only a combination that satisfies
B*A'=constant (for some matrix B).

If I generate all combination for 20 vectors using combvec, I am getting around 400,000 combinations, But I need only 200 of them which satisfies my condition.

Richard Hodges

### Richard Hodges (view profile)

To make allcomb work with cell inputs and 'matlab' parameter, you need to add the line:

varargin(end)=[];

after the if statement (line 69)

Richard

Kenan Turbic

Sergei Paleichuk

### Sergei Paleichuk (view profile)

Wasiur Rahman Khuda Bukhsh

Jos (10584)

### Jos (10584) (view profile)

@Alexander Implementing this would require the Statistics Toolbox. However, you can easily generate the table yourself, using ALLCOMB on the indices. I assume you should be able to do something like this:

idxAB = allcomb(1:numel(A),1:numel(B))
out = [A(idxAB(:,1)) B(idxAB(:,2))]

Alexander

### Alexander (view profile)

Excellent function! Given that this function can be used to create combinations of selections from a number of categories (A1...AN), could you allow it to operate on categorical arrays? The output could be either a table (preferably) or cell array, as in the example below.

A = categorical({'A1','A2'})
B = categorical({'B1','B2','B3'})
allcomb2(A,B)

% -> Var1 Var2
% ____ ____
%
% A1 B1
% A1 B2
% A1 B3
% A2 B1
% A2 B2
% A2 B3

Giorgio

shiva

### shiva (view profile)

This is an awesome piece of code!
Although i have an request, like say when I have a 5 or more large vectors (eg.,-200:200) i encounter memory problems.
I was thinking like,
1) check the maximum variable size for the particular computer.
2) if the size of the generated variable is more than the maximum size permitted store the intermediate result in a "mat" file. clear the contents of the variable and append the successive results to the end of the "mat" file

Julian Gomez

Matthieu

### Matthieu (view profile)

Hello,

I wanted to have the index of the computed combinaison.

I propose this solution if other people id interested:

[A index] = allcomb(varargin)
...
...

if nargout>1
create_index = @(x) cellfun(@(y) 1:numel(y), x, 'UniformOutput', false);
idx = create_index(args);
[index{ii}] = ndgrid(idx{ii});
index = reshape(cat(ni+1,index{:}),[],ni) ;
end

raj singh

### raj singh (view profile)

superb, i was trying for this problem, but this Ans solved my problem within second

Jos (10584)

### Jos (10584) (view profile)

@Ofer To combine strings with doubles you can use a cell array. You can use allcomb to retrieve the indices, as in

D = [10 11] % doubles
S = {'s1','s2','s3'}
ix = allcomb(1:numel(D), 1:numel(S))

Ofer Rozen

### Ofer Rozen (view profile)

great function. how can i combine strings with doubles?

Moshe Lindner

Jos (10584)

### Jos (10584) (view profile)

@Amri, good suggestion! I will update the file shortly.

Amri

### Amri (view profile)

it works only with double variables !?
i need the same function but with caracters ?

K E

### K E (view profile)

Why not built in to Matlab?

Jos (10584)

### Jos (10584) (view profile)

Thanks Edward, a small glitch on my side ... fixed in version 2.2

Edward Sciberras

### Edward Sciberras (view profile)

Jos, I think you're missing a semicolon in line 60 for ischar(argn). Results in 0 being printed in the terminal without this.

Harry MacDowel

### Harry MacDowel (view profile)

Great and easy to use!

Forrest

### Forrest (view profile)

Can you explain how to install this and get it to work?

Mike Sheppard

### Mike Sheppard (view profile)

In the Neural Network Toolbox there is combvec, which produces the same results as the examples.
combvec([1 3 5],[-3 8],[0 1])
combvec(1:2,3:4,5:6)
If you have the toolbox the combvec might be helpful, if not then allcomb might help for general.

Marco Uzielli

### Marco Uzielli (view profile)

Very efficient in my case.

Bruno Luong

Bruno Luong

### Bruno Luong (view profile)

Here is a debate that will convince you Jos.

A cartesian's product of n sets has a cardinal equals to the product of cardinals of each set.

NCOMB must return [prod(numel(xi)) x n] size array.

An empty set has zeros cardinal, thus all comb MUST return 0 x n.

Why this is important. Here is an example

In post #4 of this thread

I used NDGRID to generate a combination of 2 sets. NDGRID handles correctly empty configuration, this my code can directly work. I can't replace with ALLCOMB because the empty set is not consistently handle.

Jos (10584)

### Jos (10584) (view profile)

Somehow my first reply to Bruno does not show up. I wanted to say to Bruno "maybe I can issue a warning when an input is empty".
If ALLCOMB returns empty or ignores an empty input is, in my opinion, a matter of debate.

Jos (10584)

### Jos (10584) (view profile)

Hmm, there already is a warning ... I should read my own code more carefully ...

Bruno Luong

### Bruno Luong (view profile)

Jos, IMO allcomb returns incorrect result when one of the argument is is empty

It should return an empty (0xn) array where n is the number of arguments.

Lin Li

Jose

Peter Torrione

Very nice!

Jan Simon

### Jan Simon (view profile)

Comapct and fast algorithm - thanks!
The flipping can be omitted to save time:
[A{1:ni}] = ndgrid(args{ii}) ;
A = reshape(cat(ni+1,A{:}),[],ni) ;
A = A(:,ii) ;
==>
[A{ii}] = ndgrid(args{ii}) ;
A = reshape(cat(ni+1,A{:}),[],ni) ;
E.g. for ALLCOMB(1:100, 1:100, 1:100) this is 24% faster on my machine (Matlab 2009a, WinXP, 32 bit).

Andrea Asoni

### Andrea Asoni (view profile)

very useful. it is possible to have the exact same thing for symbolic objects (i am working with tomSym)?

Tsinghua Jun

### Tsinghua Jun (view profile)

so powerful, it is what I've been looking for~~

fabio

### fabio (view profile)

easy things are always the best! Great!

Merrill Birdno

Thanks! I've been looking for something like this.

Marco Vilela

Good job

Tom Pinkiewicz

Great, just what I wanted!

Jiying Yin

where can I find allcomb.m file? Thanks!

kinor Mueller

nice function, poor not to find it in matlab itself ;-)

Jarek Zwolski

I'd lost some time before I found it. This short piece of code sloves my problem and does it excellent. Thanks

Antoni J. Canós

Excellent! That's what I needed!

Jos van der Geest

I just updated this file: a minor "bug" was removed when none of the inputs were empty. I also added the option to let the first argument move most rapidly, as suggested by John D'Errico.

John D'Errico

Good help, error checks, not much to say here. Only one comment: I'd argue that the first argument should move most rapidly, to be consistent with Matlab indexing.

 15 Feb 2016 4.1 fixed error noted by Richard 18 Feb 2014 1.6 v4.0 accepts cell arrays as input 23 May 2012 1.5 now accepts character arrays 13 Jan 2012 1.4 remove superfluous line of code (thanks to Edward) 11 Feb 2011 1.3 (2.1, feb 2011) - fixed the check of the last argument when the last argument was neither a char or a double. 26 Dec 2010 1.2 Convinced by Bruno, I decided to change the behavior when an input is empty (now returns empty instead of ignoring the input). 4 Jan 2010 1.1 little speed improvement as suggested by Jan Simon 23 Feb 2006 Too hasty in my first revision ...
##### MATLAB Release
MATLAB 8.5 (R2015a)
##### Acknowledgements

Inspired: Create Unique Interaction Variables