2016-11-15 202 views
1

我刚开始与Wolfram Mathematica的旅程,我想实现一个简单的遗传算法。数据的构建是给出的,我必须从这样的行/列开始。如何将矩阵值更改为来自另一个矩阵的值 - Wolfram

以下是我有:

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

,你可能觉得http://mathematica.stackexchange.com问这个问题,但是如果你确实从这个网站删除它。交叉发布是相当皱眉。 –

+0

有点附带说明,但通常不建议以格式形式存储任何内容。你应该做'(chromosomeList = Table [chromosome,7])// MatrixForm',它存储表格并且只是显示格式。 – agentp

回答

1

您可以使用函数Through将某些函数的列表应用于某个变量,这在多次应用Position时很有用。因为Position[patt][expr] == Position[expr, patt],我们可以做

Through[ (Position /@ CharacterRange["A","C"])[{"B", "C", "A"}] ] 

得到{3, 1, 2}

Position还可以在列表中进行操作,所以我们可以简化做

[email protected][Last, Through[(Position /@ characters)[chromosomeList]], {2}] 

其中charactersCharacterRange相关输出发现ypos

我们还可以简化与整数的范围通过映射在Range功能处理,所以在总我们最终

characters = CharacterRange["A","G"] 
efficiencies = ... 
chromosomes = ... 

ypos = [email protected][Last, Through[(Position /@ characters)[chromosomes]], {2}]; 
efficiencies[[#, ypos[[#]]]]& /@ Range[Length[characters]] //Transpose ] 
相关问题