Problème de correspondance d'entrée vectorielle
J'ai une liste composée de vecteurs. Disons avec cinq entrées dans chacun. La liste peut avoir n'importe quelle dimension.
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}};
Les trois premiers composants de chaque vecteur sont dans l'ensemble {-1, 0, 1}. Les 4e et 5e sont soit 0 soit 1.
Je veux ajouter la 4e et la 5e entrée dans tous les vecteurs sont identiques dans les trois premières entrées.
J'ai pensé à comparer les trois premières entrées en utilisant HammingDistance; quelque chose comme
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]
mais cela ne sélectionne que les vecteurs dans lesquels le motif est trouvé plus d'une fois. Une idée de la façon de faire correspondre et d'encombrer tous les vecteurs avec les mêmes 3 premières entrées?
Réponses
Essaye ça.
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]
qui affiche
{{{-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}}}
montrant comment il a regroupé des vecteurs avec les trois premiers éléments communs
et alors
{{-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}}
montrant comment il a totalisé les deux derniers éléments de chaque groupe.
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}}
ou
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}}