我需要生成组合了三个不同子集的完整组合:
示例:样本3来自向量为4 (H=3和L=4)的集合A,H=2 L=3用于集合B,H=2 L=4用于集合B:
4 4 4
3 4 4
3 3 4
3 3 3
2 4 4
2 3 4
2 3 3
2 2 4
Set A = 2 2 3
2 2 2
1 4 4
1 3 4
1 3 3
1 2 4
1 2 3
1 2 2
1 1 4
1 1 3
1 1 2
1 1 1
3 3
2 3
Set B = 2 2
1 3
1 2
1 1
4 4
3 4
3 3
2 4
Set C = 2 3
2 2
1 4
1 3
1 2
1 1[Set A] = [20 x 3],[Set B] = [6 x 2],[Set C] = [10 x 2]。然后我需要从这三个集合中获得所有可能的组合:AllComb = [Set A] x [Set B] x [Set C] = [1200 x 8]。AllComb矩阵将如下所示:
4 4 4 | 3 3 | 4 4
4 4 4 | 3 3 | 3 4
4 4 4 | 3 3 | 3 3
4 4 4 | 3 3 | 2 4
4 4 4 | 3 3 | 2 3
4 4 4 | 3 3 | 2 2
4 4 4 | 3 3 | 1 4
4 4 4 | 3 3 | 1 3
4 4 4 | 3 3 | 1 2
4 4 4 | 3 3 | 1 1
4 4 4 | 2 3 | 4 4
4 4 4 | 2 3 | 3 4
4 4 4 | 2 3 | 3 3
4 4 4 | 2 3 | 2 4
4 4 4 | 2 3 | 2 3
.
.
.
1 1 1 | 1 1 | 1 1不幸的是,我不能用相同的数字来表示集合,因为我需要替换这样的数字:
Set A:1= 10,2= 25,3= 30,4= 45Set B:1= 5,2= 20和3= 35Set C:1= 10,2= 20,3= 30,4= 50有什么想法吗?实际案例集往往会导致AllComb矩阵~491400x8,因此向量化解将被欣然接受。
注意:每一组都有以下代码:
a = combnk(1:H+L-1, H);
b = cumsum([a(:,1) diff(a,[],2) - 1],2);什么是H和L?
H是MultiheadWeigher (MHW)机器的漏斗。我有一个带有H=8的MHW,我需要在每个料斗中交付一些材料。如果我只需要交付一种类型的材料,那么所有可能的组合都是(L+H-1)!/(H!(L-1)!),我用上面编写的代码(a和b)来计算它们。现在,假设有3个不同的乘积,那么我们有4个料斗用于产品A,2个用于B,2个用于C。产品A可以假定值为10:10:130,product,10:10:30和c 10:10:90。然后是A L=13,B L=3和C L=9的步骤数
发布于 2014-06-17 10:43:03
你基本上需要找到
这两个阶段都可以用大致相同的逻辑来解决,这些逻辑取自这里。
%// Stage 1, set A
LA = 4;
HA = 3;
SetA = cell(1,HA);
[SetA{:}] = ndgrid(1:LA);
SetA = cat(HA+1, SetA{:});
SetA = reshape(SetA,[],HA);
SetA = unique(sort(SetA(:,1:HA),2),'rows');
%// Stage 1, set B
LB = 3;
HB = 2;
SetB = cell(1,HB);
[SetB{:}] = ndgrid(1:LB);
SetB = cat(HB+1, SetB{:});
SetB = reshape(SetB,[],HB);
SetB = unique(sort(SetB(:,1:HB),2),'rows');
%// Stage 1, set C
LC = 4;
HC = 2;
SetC = cell(1,HC);
[SetC{:}] = ndgrid(1:LC);
SetC = cat(HC+1, SetC{:});
SetC = reshape(SetC,[],HC);
SetC = unique(sort(SetC(:,1:HC),2),'rows');
%// Stage 2
L = 3; %// number of sets
result = cell(1,L);
[result{:}] = ndgrid(1:size(SetA,1),1:size(SetB,1),1:size(SetC,1));
result = cat(L+1, result{:});
result = reshape(result,[],L);
result = [ SetA(result(:,1),:) SetB(result(:,2),:) SetC(result(:,3),:) ];
result = flipud(sortrows(result)); %// put into desired order这给了我们
result =
4 4 4 3 3 4 4
4 4 4 3 3 3 4
4 4 4 3 3 3 3
4 4 4 3 3 2 4
4 4 4 3 3 2 3
4 4 4 3 3 2 2
4 4 4 3 3 1 4
4 4 4 3 3 1 3
4 4 4 3 3 1 2
4 4 4 3 3 1 1
4 4 4 2 3 4 4
4 4 4 2 3 3 4
4 4 4 2 3 3 3
4 4 4 2 3 2 4
4 4 4 2 3 2 3
4 4 4 2 3 2 2
4 4 4 2 3 1 4
4 4 4 2 3 1 3
4 4 4 2 3 1 2
... 发布于 2014-06-17 09:54:51
我想这可能会进一步优化,但是这会生成AllComb
H=3;
L=4;
a = combnk(1:H+L-1, H);
b = cumsum([a(:,1) diff(a,[],2) - 1],2);
H=2;
L=3;
c = combnk(1:H+L-1, H);
d = cumsum([c(:,1) diff(c,[],2) - 1],2);
H=2;
L=4;
e = combnk(1:H+L-1, H);
f = cumsum([e(:,1) diff(e,[],2) - 1],2);
u=[];
for k=1:10
u=vertcat(u,d);
end
u=sortrows(u,[1 2]);
v=[];
for k=1:6
v= vertcat(v,f);
end
w= [u,v];
v=[];
for k=1:20
v= vertcat(v,w);
end
u=[];
for k=1:60
u = vertcat(u,b);
end
u=sortrows(u,[1 2 3]);
AllComb= [u,v];这里,b,d和f是你的3套。然后,我循环计算d和f中的置换数,并对它们进行复制,从而构造出所有的可能性。其中一个被排序,然后我将它们写进一个新的矩阵w中。THis过程是用集A (b)和这个新构造的矩阵来重复的。导致在AllComb中结束。
https://stackoverflow.com/questions/24259125
复制相似问题