Tuesday, January 11, 2011

MATLAB function: all combinations in a vector

function [vout len_array] = combn_all(v, k)
% combn_all All combinations of the N elements in V.
%   Inputs: v, a row or column vector,
%           k, a scalar or vector, see the MATLAB built-in function 
%              combnk for details
%
%   Outputs: vout, a cell array
n =length(v);

if nargin <2
    k =1:n;
end

if strcmpi(k, 'all')
    k =1:n;
end

len_array =factorial(n)./(factorial(k).*factorial(n-k));
vout =cell(1, sum(len_array));

for m =1:length(k)
    vn =combnk(v, k(m));
    if m ==1
        ind1 =1;
    else
    ind1 =sum(len_array(1:m-1))+1;
    end
    ind2 =ind1+len_array(m)-1;
    vout(ind1: ind2) =mat2cell(vn, ones(1, size(vn, 1)), size(vn, 2));
end





**************************************
Examples:




>> [vout len_array] = combn_all([1 2 3], 1)
vout =
    [1]    [2]    [3]
len_array =
     3


------------------------------------------------------------------------------------------------




>> [vout len_array] = combn_all([1 2 3], [1 2])
vout =
    [1]    [2]    [3]    [1x2 double]    [1x2 double]    [1x2 double]
len_array =
     3     3
>> vout{4:end}
ans =
     1     2
ans =
     1     3
ans =
     2     3
function [vout len_array] = combn_all(v, k)
% combn_all All combinations of the N elements in V.
%   Inputs: v, a row or column vector,
%           k, a scalar or vector, see the MATLAB built-in function 
%              combnk for details
%
%   Outputs: vout, a cell array

n =length(v);

if nargin <2
    k =1:n;
end

if strcmpi(k, 'all')
    k =1:n;
end

len_array =factorial(n)./(factorial(k).*factorial(n-k));
vout =cell(1, sum(len_array));

for m =1:length(k)
    vn =combnk(v, k(m));
    if m ==1
        ind1 =1;
    else
    ind1 =sum(len_array(1:m-1))+1;
    end
    ind2 =ind1+len_array(m)-1;
    vout(ind1: ind2) =mat2cell(vn, ones(1, size(vn, 1)), size(vn, 2));
end

No comments:

Post a Comment