wolffd@0: function [T, bitv] = subsets(S, U, L, sorted, N) wolffd@0: % SUBSETS Create a set of all the subsets of S which have cardinality <= U and >= L wolffd@0: % T = subsets(S, U, L) wolffd@0: % U defaults to length(S), L defaults to 0. wolffd@0: % So subsets(S) generates the powerset of S. wolffd@0: % wolffd@0: % Example: wolffd@0: % T = subsets(1:4, 2, 1) wolffd@0: % T{:} = 1, 2, [1 2], 3, [1 3], [2 3], 4, [1 4], [2 4], [3 4] wolffd@0: % wolffd@0: % T = subsets(S, U, L, sorted) wolffd@0: % If sorted=1, return the subsets in increasing size wolffd@0: % wolffd@0: % Example: wolffd@0: % T = subsets(1:4, 2, 1, 1) wolffd@0: % T{:} = 1, 2, 3, 4, [1 2], [1 3], [2 3], [1 4], [2 4], [3 4] wolffd@0: % wolffd@0: % [T, bitv] = subsets(S, U, L, sorted, N) wolffd@0: % Row i of bitv is a bit vector representation of T{i}, wolffd@0: % where bitv has N columns (representing 1:N). wolffd@0: % N defaults to max(S). wolffd@0: % wolffd@0: % Example: wolffd@0: % [T,bitv] = subsets(2:4, 2^3, 0, 0, 5) wolffd@0: % T{:} = [], 2, 3, [2 3], 4, [2 4], [3 4], [2 3 4] wolffd@0: % bitv= wolffd@0: % 0 0 0 0 0 wolffd@0: % 0 1 0 0 0 wolffd@0: % 0 0 1 0 0 wolffd@0: % 0 1 1 0 0 wolffd@0: % 0 0 0 1 0 wolffd@0: % 0 1 0 1 0 wolffd@0: % 0 0 1 1 0 wolffd@0: % 0 1 1 1 0 wolffd@0: wolffd@0: n = length(S); wolffd@0: wolffd@0: if nargin < 2, U = n; end wolffd@0: if nargin < 3, L = 0; end wolffd@0: if nargin < 4, sorted = 0; end wolffd@0: if nargin < 5, N = max(S); end wolffd@0: wolffd@0: bits = ind2subv(2*ones(1,n), 1:2^n)-1; wolffd@0: sm = sum(bits,2); wolffd@0: masks = bits((sm <= U) & (sm >= L), :); wolffd@0: m = size(masks, 1); wolffd@0: T = cell(1, m); wolffd@0: for i=1:m wolffd@0: s = S(find(masks(i,:))); wolffd@0: T{i} = s; wolffd@0: end wolffd@0: wolffd@0: if sorted wolffd@0: T = sortcell(T); wolffd@0: end wolffd@0: wolffd@0: bitv = zeros(m, N); wolffd@0: bitv(:, S) = masks;