我刚开始与Wolfram Mathematica一起旅行,我想实现一个简单的遗传算法。给出了数据的构造,我必须从这样的行/列开始。
这就是我所拥有的:
chromosome := RandomSample[CharacterRange["A", "G"], 7]
chromosomeList = Table[chromosome, 7] // MatrixForm
这给了我一个矩阵,每行代表一条染色体:
yPos = Flatten[Position[chromosomeList, #], 1] & /@ {"A", "B", "C",
"D", "E", "F", "G"};
yPos = yPos[[All, 3 ;; 21 ;; 3]] // Transpose
现在每一列都代表一个字母(从A到G)以及它在每条染色体上的每一行索引:
这是一个给定的效率矩阵,其中非常行表示不同的字母(从A到G),每列给出应该应用于特定位置的值:
efficiencyMatrix = {
{34, 31, 20, 27, 24, 24, 18},
{14, 14, 22, 34, 26, 19, 22},
{22, 16, 21, 27, 35, 25, 30},
{17, 21, 24, 16, 31, 22, 20},
{17, 29, 22, 31, 18, 19, 26},
{26, 29, 37, 34, 37, 20, 21},
{30, 28, 37, 28, 29, 23, 19}}
我想要做的是创建一个矩阵,其值与字母及其位置相对应。我这样做了:
values = Transpose[{ efficiencyMatrix[[1, yPos[[1]]]],
efficiencyMatrix[[2, yPos[[2]]]],
efficiencyMatrix[[3, yPos[[3]]]],
efficiencyMatrix[[4, yPos[[4]]]],
efficiencyMatrix[[5, yPos[[5]]]],
efficiencyMatrix[[6, yPos[[6]]]],
efficiencyMatrix[[7, yPos[[7]]]]}]
我怎样才能以更优雅的方式写出来?
答案 0 :(得分:1)
您可以使用函数Through
将函数列表应用于某个变量,这在多次应用Position
时很有用。因为Position[patt][expr] == Position[expr, patt]
,我们可以做到
Through[ (Position /@ CharacterRange["A","C"])[{"B", "C", "A"}] ]
获取{3, 1, 2}
。
Position
也可以对列表进行操作,因此我们可以通过
ypos
Transpose@Map[Last, Through[(Position /@ characters)[chromosomeList]], {2}]
其中characters
是CharacterRange
的相关输出。
我们还可以通过映射Range
函数来简化处理整数范围,因此我们最终得到了
characters = CharacterRange["A","G"]
efficiencies = ...
chromosomes = ...
ypos = Transpose@Map[Last, Through[(Position /@ characters)[chromosomes]], {2}];
efficiencies[[#, ypos[[#]]]]& /@ Range[Length[characters]] //Transpose ]