Wolfram mathematica Mathematica枚举组合
我需要列举我拥有的3组值的组合。例如,这些组是(a,b,c,d),(e,f,g,h),(i,j,k,l)。总组合为4x4x4=64。 有没有人知道,我如何定义这些组合的升序编号? 我以这种形式写了一些东西: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。 谢谢你
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]
真的