Vấn đề đối sánh mục nhập vectơ

Sep 17 2020

Tôi có một danh sách được tạo bởi các vectơ. Giả sử với năm mục trong mỗi mục. Danh sách có thể có bất kỳ thứ nguyên nào.

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

Ba thành phần đầu tiên của mỗi vectơ nằm trong tập {-1, 0, 1}. Số 4 và 5 là 0 hoặc 1.

Tôi muốn thêm mục thứ 4 và thứ 5 trong tất cả các vectơ giống hệt nhau trong ba mục đầu tiên.

Tôi mặc dù để so sánh ba mục đầu tiên bằng cách sử dụng HammingDistance; cái gì đó như

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]

nhưng điều này chỉ chọn các vectơ trong đó mẫu được tìm thấy nhiều hơn một lần. Bất kỳ ý tưởng nào về cách đối sánh và lộn xộn tất cả các vectơ có cùng 3 mục nhập đầu tiên?

Trả lời

3 Bill Sep 17 2020 at 18:37

Thử cái này.

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]

cái nào hiển thị

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

hiển thị cách nó nhóm các vectơ với ba phần tử đầu tiên chung

và sau đó

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

hiển thị cách nó tổng cộng hai phần tử cuối cùng trong mỗi nhóm.

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

hoặc là

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