Advance combination of sets and subsets

1 次查看(过去 30 天)
Hi
I am having trouble in solving a combination problem as follows, For example:
There are 4 sets each having different sub parts
set(A) = ['A1' 'A2' 'A3' 'A4' 'A5' 'A6'];
set(B) = ['B1' 'B2' 'B3' 'B4' 'B5'];
set(C) = ['C1' 'C2' 'C3' 'C4'];
set(D) = ['D1' 'D2' 'D3' 'D4'];
Based original code of combination:
combos = combntns(set,subset);
now the question is: I have sub part of sets and I want combination of subparts of sets for subset=4 ,where same sub parts of a set should not be in the same combination. The problem is that by running original code, sub parts of single set also is getting combined, but this is not the right for me. the result should be as follow:
['A1' 'B1' 'C1' 'D1'],
['A1' 'B2' 'C1' 'D1'],
['A1' 'B3' 'C1' 'D1'],
['A2' 'B1' 'C1' 'D3'],
['A3' 'B3' 'C2' 'D3'],
['A5' 'B5' 'C4' 'D2'],
...
AND GO ON.....
but original code creates this: [A1 A2 C1 D1], or [A1 B1 B2 D1], ..... which is not true because sub part of set is repeated in single combination (for example B1 and B2 in the same combination).
i would appreciate if someone can put me through right direction.
Regards

回答(1 个)

the cyclist
the cyclist 2014-4-29
编辑:the cyclist 2014-4-29
Here is one straightforward implementation:
% Put in actual values here. I just used 1:6, etc, for testing.
A = 1:6;
B = 1:5;
C = 1:4;
D = 1:3;
S = nan(numel(A)*numel(B)*numel(C)*numel(D),4);
rowcount = 0;
for i1 = 1:numel(A)
for i2 = 1:numel(B)
for i3 = 1:numel(C)
for i4 = 1:numel(D)
if not(i1==i2 || i1==i3 || i1==i4 || i2==i3 || i2==i4 || i3==i4)
rowcount = rowcount + 1;
S(rowcount,:) = [A(i1) B(i2) C(i3) D(i4)];
end
end
end
end
end
S(rowcount+1:end,:) = [];
Notice that I preallocate quite a bit more memory than I need, because I was too lazy to figure out how many rows you'll need. I think it might be (shortest vector)^(number of sets), but I am not sure.

类别

Help CenterFile Exchange 中查找有关 Discrete Math 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by