Wolfram mathematica Mathematica枚举组合

Wolfram mathematica Mathematica枚举组合,wolfram-mathematica,combinations,Wolfram Mathematica,Combinations,我需要列举我拥有的3组值的组合。例如,这些组是(a,b,c,d),(e,f,g,h),(i,j,k,l)。总组合为4x4x4=64。 有没有人知道,我如何定义这些组合的升序编号? 我以这种形式写了一些东西: Do[Do[Do[x["formula is needed here"]=s[[i,j,k]],{k,1,4}],{j,1,4}],{i,1,4}] 我找不到组合编号的公式。我读过一些关于“生成数学组合中的第m个词典元素”的书,但我感到迷茫多于帮助。x应该取值1,2,3,…,64。 谢谢你

我需要列举我拥有的3组值的组合。例如,这些组是(a,b,c,d),(e,f,g,h),(i,j,k,l)。总组合为4x4x4=64。 有没有人知道,我如何定义这些组合的升序编号? 我以这种形式写了一些东西:

Do[Do[Do[x["formula is needed here"]=s[[i,j,k]],{k,1,4}],{j,1,4}],{i,1,4}]
我找不到组合编号的公式。我读过一些关于“生成数学组合中的第m个词典元素”的书,但我感到迷茫多于帮助。x应该取值1,2,3,…,64。 谢谢你的建议

如果您需要“n”元组的“公式”,它看起来如下所示:

Tuples[{{a, b, c, d}, {e, f, g, h}, {i, j, k, l}}]
{ Floor[(# - 1)/16      ] + 1,
  Floor[Mod[# - 1, 16]/4] + 1 , 
  Floor[Mod[# - 1, 4]   ] + 1 } & /@ Range[64] ==
  Tuples[Range[4], 3]
({ 
     Floor[(# - 1)/16] + 1,
     Floor[Mod[# - 1, 16]/4 + 1] ,
     Mod[# - 1, 4] + 1 } &@12);
{{a, b, c, d}[[%[[1]]]], {e, f, g, h}[[%[[2]]]], {i, j, k, 
   l}[[%[[3]]]]}
真的

因此,如果你想说你的集合的第12个组合,你可以这样做:

{ Floor[(# - 1)/16      ] + 1,
  Floor[Mod[# - 1, 16]/4] + 1 , 
  Floor[Mod[# - 1, 4]   ] + 1 } & /@ Range[64] ==
  Tuples[Range[4], 3]
({ 
     Floor[(# - 1)/16] + 1,
     Floor[Mod[# - 1, 16]/4 + 1] ,
     Mod[# - 1, 4] + 1 } &@12);
{{a, b, c, d}[[%[[1]]]], {e, f, g, h}[[%[[2]]]], {i, j, k, 
   l}[[%[[3]]]]}
{a,g,l}

请注意,无论您在做什么,几乎总是最好使用内置的面向对象函数

 Tuples[{{a, b, c, d}, {e, f, g, h}, {i, j, k, l}}][[12]]
{a,g,l}

编辑:为了完整性,第一个表达式的泛化:

listlen = 6;
nsamp = 4;
Table[Floor[Mod[# - 1, listlen^i]/listlen^(i - 1) + 1], {i, nsamp, 
     1, -1}] & /@ Range[listlen^nsamp] ==
  Tuples[Range[listlen], nsamp] 
真的

如果您需要“n”元组的“公式”,它如下所示:

{ Floor[(# - 1)/16      ] + 1,
  Floor[Mod[# - 1, 16]/4] + 1 , 
  Floor[Mod[# - 1, 4]   ] + 1 } & /@ Range[64] ==
  Tuples[Range[4], 3]
({ 
     Floor[(# - 1)/16] + 1,
     Floor[Mod[# - 1, 16]/4 + 1] ,
     Mod[# - 1, 4] + 1 } &@12);
{{a, b, c, d}[[%[[1]]]], {e, f, g, h}[[%[[2]]]], {i, j, k, 
   l}[[%[[3]]]]}
真的

因此,如果你想说你的集合的第12个组合,你可以这样做:

{ Floor[(# - 1)/16      ] + 1,
  Floor[Mod[# - 1, 16]/4] + 1 , 
  Floor[Mod[# - 1, 4]   ] + 1 } & /@ Range[64] ==
  Tuples[Range[4], 3]
({ 
     Floor[(# - 1)/16] + 1,
     Floor[Mod[# - 1, 16]/4 + 1] ,
     Mod[# - 1, 4] + 1 } &@12);
{{a, b, c, d}[[%[[1]]]], {e, f, g, h}[[%[[2]]]], {i, j, k, 
   l}[[%[[3]]]]}
{a,g,l}

请注意,无论您在做什么,几乎总是最好使用内置的面向对象函数

 Tuples[{{a, b, c, d}, {e, f, g, h}, {i, j, k, l}}][[12]]
{a,g,l}

编辑:为了完整性,第一个表达式的泛化:

listlen = 6;
nsamp = 4;
Table[Floor[Mod[# - 1, listlen^i]/listlen^(i - 1) + 1], {i, nsamp, 
     1, -1}] & /@ Range[listlen^nsamp] ==
  Tuples[Range[listlen], nsamp] 
真的