Vektoreintragsübereinstimmungsproblem

Sep 17 2020

Ich habe eine Liste, die aus Vektoren besteht. Sagen wir mit jeweils fünf Einträgen. Die Liste kann eine beliebige Dimension haben.

file =  
  {{1, 0, -1, 1, 0}, {-1, 0, -1, 0, 0}, {1, 0, 1, 0, 0}, {1, 0, -1, 0, 1}, 
   {1, 0, -1, 1, 0}, {-1, 0, 1, 0, 0}, {1, 0, 1, 0, 0}, {1, 0, 0, 0, 0}, 
   {0, 0, 1, 0, 0}, {1, 0, 1, 1, 0}};

Die ersten drei Komponenten jedes Vektors befinden sich in der Menge {-1, 0, 1}. Der 4. und 5. sind entweder 0 oder 1.

Ich möchte den 4. und 5. Eintrag in allen Vektoren hinzufügen, die in den ersten drei Einträgen identisch sind.

Ich möchte die ersten drei Einträge mit vergleichen HammingDistance; etwas wie

If[Length[file] != 0,
  DeleteCases[
    Flatten[
      Table[
        If[
          i != j && 
            HammingDistance[Drop[file[[i]], -2], Drop[file[[j]], -2]] ==0, 
          {file[[i]][[1]], file[[i]][[2]],file[[i]][[3]],file[[i]][[4]], file[[i]][[5]]}, 
           0], 
        {i, 1, Length[file]}, {j,1, i}], 
      1], 
    0], 
  0]

Dies wählt jedoch nur Vektoren aus, in denen das Muster mehr als einmal gefunden wird. Haben Sie eine Idee, wie Sie alle Vektoren mit denselben ersten drei Einträgen abgleichen und überladen können?

Antworten

3 Bill Sep 17 2020 at 18:37

Versuche dies.

file={{1,0,-1,1,0},{-1,0,-1,0,0},{1,0,1,0,0},{1,0,-1,0,1},{1,0,-1,1,0},{-1,0,1,0,0},
      {1,0,1,0,0},{1,0,0,0,0},{0,0,1,0,0},{1,0,1,1,0}};
grouped=Split[Sort[file],Take[#1,3]==Take[#2,3]&]
Map[Join[Take[#[[1]],3],Drop[Total[#],3]]&,grouped]

welche anzeigt

{{{-1,0,-1,0,0}},{{-1,0,1,0,0}},{{0,0,1,0,0}},{{1,0,-1,0,1},{1,0,-1,1,0}, 
 {1,0,-1,1,0}},{{1,0,0,0,0}},{{1,0,1,0,0},{1,0,1,0,0},{1,0,1,1,0}}}

zeigt, wie es Vektoren mit gemeinsamen ersten drei Elementen gruppiert

und dann

{{-1,0,-1,0,0},{-1,0,1,0,0},{0,0,1,0,0},{1,0,-1,2,1},{1,0,0,0,0},{1,0,1,1,0}}

zeigt, wie die letzten beiden Elemente in jeder Gruppe summiert wurden.

3 kglr Sep 17 2020 at 20:28
KeyValueMap[Join] @ GroupBy[file, (Take[#, 3] &) -> (Drop[#, 3] &), Total]
 {{1, 0, -1, 2, 1}, {-1, 0, -1, 0, 0}, {1, 0, 1, 1, 0}, {-1, 0, 1, 0,  0}, 
  {1, 0, 0, 0, 0}, {0, 0, 1, 0, 0}}

oder

KeyValueMap[Join] @ Merge[Total] @ Map[Association[Rule @@ TakeDrop[#, 3]] &] @ file
 {{1, 0, -1, 2, 1}, {-1, 0, -1, 0, 0}, {1, 0, 1, 1, 0}, {-1, 0, 1, 0,  0}, 
  {1, 0, 0, 0, 0}, {0, 0, 1, 0, 0}}