Generate all possible combinations of the elements of some vectors (Cartesian product)

后端 未结 4 1157
南笙
南笙 2020-11-22 13:32

I would like to generate all the possible combinations of the elements of a given number of vectors.

For example, for [1 2], [1 2] and

4条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-11-22 13:47

    Consider this solution using the NDGRID function:

    sets = {[1 2], [1 2], [4 5]};
    [x y z] = ndgrid(sets{:});
    cartProd = [x(:) y(:) z(:)];
    
    cartProd =
         1     1     4
         2     1     4
         1     2     4
         2     2     4
         1     1     5
         2     1     5
         1     2     5
         2     2     5
    

    Or if you want a general solution for any number of sets (without having to create the variables manually), use this function definition:

    function result = cartesianProduct(sets)
        c = cell(1, numel(sets));
        [c{:}] = ndgrid( sets{:} );
        result = cell2mat( cellfun(@(v)v(:), c, 'UniformOutput',false) );
    end
    

    Note that if you prefer, you can sort the results:

    cartProd = sortrows(cartProd, 1:numel(sets));
    

    Also, the code above does not check if the sets have no duplicate values (ex: {[1 1] [1 2] [4 5]}). Add this one line if you want to:

    sets = cellfun(@unique, sets, 'UniformOutput',false);
    

提交回复
热议问题