Поиск переменных, которые имеют общие свойства - PullRequest
4 голосов
/ 20 июля 2011

Я использую Mathematica и у меня есть набор переменных (A, B, C, D, ...) со свойствами A = (синий, большой, округлый), B = (красный, маленький, остроконечный) итак далее.Эти свойства могут быть общими для переменных.Каков наилучший общий способ найти все переменные, которые имеют общее свойство (например, быть маленькими)?Спасибо.

1 Ответ

7 голосов
/ 20 июля 2011

Вот список возможных свойств:

In[1]:= properties={"red","green","blue","big","small","rounded","spiky"};

А вот список объектов с некоторыми из этих свойств

In[2]:= list={{"blue","big","rounded"},{"red","small","spiky"},
              {"red","big","rounded"},{"blue","small","spiky"}};

Вы можете найти все объекты, которые имеют свойство, например, быть "синим", используя Select

In[3]:= Select[list, MemberQ[#,"blue"]&]
Out[3]= {{blue,big,rounded},{blue,small,spiky}}

Это может быть заключено в функцию. Хотя то, как я напишу эту функцию, будет зависеть от структур данных и использования, которые вы планируете.


На самом деле, я просто перечитал ваш вопрос, у вас есть список объектов с некоторыми свойствами, и вы хотите ссылаться на эти объекты по имени. Таким образом, вы, вероятно, хотите что-то еще, как

In[1]:= listProperties["A"]:={"blue","big","rounded"}
        listProperties["B"]:={"red","small","spiky"}
        listProperties["C"]:={"red","big","rounded"}
        listProperties["D"]:={"blue","small","spiky"}

Выше я определил некоторые свойства, которые связаны с определенными строками. Вам не нужно использовать строки выше или ниже, и вы можете создать лучшую структуру, чем эта, если хотите. Вы также можете сделать конструктор для создания вышеупомянутого, такой конструктор также может проверить, имеет ли список предоставленных свойств правильную форму - то есть не имеет противоречивых свойств, все в списке известных свойств и т.д ...

Затем мы определяем функцию для проверки, имеет ли объект / строка определенное свойство, связанное с ним

In[2]:= hasProperty[obj_, property_]:=MemberQ[listProperties[obj],property]

Возможно, вы захотите вернуть сообщение об ошибке или предупреждение, если listProperties[obj] не имеет определения / правила, связанного с ним.

Используйте Select, чтобы найти все "объекты" в списке, у которых есть связанное свойство "синий":

In[3]:= Select[{"A","B","C","D"}, hasProperty[#,"blue"]&]
Out[3]= {A,D}

Существуют и другие способы (возможно, более эффективные) для настройки такой структуры данных. Но это один из самых простых способов в Mathematica.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...