Vektoreintragsübereinstimmungsproblem
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
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.
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}}