Problem z dopasowaniem wpisu wektora

Sep 17 2020

Mam listę złożoną z wektorów. Powiedzmy, że każdy z nich ma pięć wpisów. Lista może mieć dowolny wymiar.

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}};

Pierwsze trzy składowe każdego wektora znajdują się w zbiorze {-1, 0, 1}. Czwarte i piąte to 0 lub 1.

Chcę dodać 4. i 5. wpis we wszystkich wektorach są identyczne w pierwszych trzech wpisach.

Chciałem porównać pierwsze trzy wpisy za pomocą HammingDistance; coś jak

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]

ale to wybiera tylko wektory, w których wzorzec występuje więcej niż raz. Masz pomysł, jak dopasować i zaśmiecać wszystkie wektory tymi samymi pierwszymi trzema wpisami?

Odpowiedzi

3 Bill Sep 17 2020 at 18:37

Spróbuj tego.

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]

który wyświetla

{{{-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}}}

pokazując, jak grupuje wektory o wspólnych pierwszych trzech elementach

i wtedy

{{-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}}

pokazując, jak sumuje ostatnie dwa elementy w każdej grupie.

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}}

lub

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}}