Code covered by the BSD License

5.0

5.0 | 23 ratings Rate this file 197 Downloads (last 30 days) File Size: 2.28 KB File ID: #10064

# ALLCOMB

20 Feb 2006 (Updated 23 May 2012)

All combinations of input (v3.0, may 2012)

### Editor's Notes:

This file was a File Exchange Pick of the Week

File Information
Description

B = ALLCOMB(A1,A2,A3,...,AN) returns all combinations of the elements in 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.

Empty inputs yields an empty matrix B of size 0-by-N. Note that previous versions (1.x) simply ignored empty inputs.

Example:
allcomb([1 3 5],[-3 8],[0 1]) ;
1 -3 0
1 -3 1
1 8 0
...
5 -3 1
5 8 0
5 8 1

ALLCOMB(A1,..AN,'matlab') causes the first column to change fastest. This is more consistent with matlab indexing. Example:
allcomb(1:2,3:4,5:6,'matlab') %->
1 3 5
2 3 5
1 4 5
...
2 4 6

This functionality is also known as the cartesian product.

ALLCOMB also accepts character arrays:
allcomb('abc','XY')
aX
aY
bX
bY
cX
cY

Acknowledgements

This file inspired Create Unique Interaction Variables.

MATLAB release MATLAB 6.5 (R13)
13 Sep 2013

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

22 Jun 2013
04 May 2013

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

19 Apr 2013

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

22 Mar 2013

@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))

21 Mar 2013

great function. how can i combine strings with doubles?

19 Jan 2013
23 May 2012

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

23 May 2012

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

05 Apr 2012

Why not built in to Matlab?

13 Jan 2012

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

11 Jan 2012

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

23 Oct 2011

Great and easy to use!

30 May 2011

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

11 Feb 2011

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.

03 Jan 2011

Very efficient in my case.

29 Dec 2010
24 Dec 2010

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.

24 Dec 2010

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.

24 Dec 2010

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

24 Dec 2010

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.

02 Dec 2010
23 Sep 2010
09 Jul 2010

Very nice!

30 Dec 2009

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).

06 Aug 2009

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

19 Jun 2009

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

14 Nov 2008

easy things are always the best! Great!

19 Sep 2008

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

06 Aug 2008

Good job

29 May 2008

Great, just what I wanted!

31 Mar 2008

where can I find allcomb.m file? Thanks!

20 Feb 2008

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

06 Jun 2007

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

03 Nov 2006

Excellent! That's what I needed!

22 Feb 2006

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.

21 Feb 2006

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.

23 Feb 2006

Too hasty in my first revision ...

23 Feb 2006

1) Removed a erroneous warning when no empty inputs were _not_ provided.
2) Added the option to let the first input run fastest (thanks to John D'Errico)

04 Jan 2010

little speed improvement as suggested by Jan Simon

26 Dec 2010

Convinced by Bruno, I decided to change the behavior when an input is empty (now returns empty instead of ignoring the input).

11 Feb 2011

(2.1, feb 2011) - fixed the check of the last argument when the last argument was neither a char or a double.

13 Jan 2012

remove superfluous line of code (thanks to Edward)

23 May 2012

now accepts character arrays