如何将矩阵值更改为另一个矩阵的值 - Wolfram

时间:2016-11-15 13:32:02

标签: list dictionary matrix wolfram-mathematica populate

我刚开始与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]]]]}]

我怎样才能以更优雅的方式写出来?

1 个答案:

答案 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}]

其中charactersCharacterRange的相关输出。

我们还可以通过映射Range函数来简化处理整数范围,因此我们最终得到了

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

ypos = Transpose@Map[Last, Through[(Position /@ characters)[chromosomes]], {2}];
efficiencies[[#, ypos[[#]]]]& /@ Range[Length[characters]] //Transpose ]