Определение специальных операторов в Mathematica - PullRequest
4 голосов
/ 19 июля 2011

Как вы определяете специальный оператор в Mathematica, например, специальный тип аддитивного или мультипликативного оператора?Я делал это в прошлом, но не могу вспомнить, куда я положил код.Я попытался определить этот заполненный оператор малого круга на двух матрицах:

A_\[FilledSmallCircle] B_ := 
  Which[(MatrixQ[A] || VectorQ[A]) && (MatrixQ[B] || VectorQ[B]), 
   A.B, ! (MatrixQ[A] || VectorQ[A]) && (MatrixQ[B] || VectorQ[B]), 
   A@B, (MatrixQ[A] || VectorQ[A]) && ! (MatrixQ[B] || VectorQ[B]), 
   Transpose[B@Transpose[A]]];

Но это не работает.Что я делаю не так?

Ответы [ 3 ]

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

Итак, вы пытаетесь сделать оператор с инфиксным действием. Если вы сравните его со встроенными инфиксными операторами +, *, **, \[CircleTimes] и т. Д. ..., вы увидите, что все они интерпретируются как их FullForm: Plus, Times, NonCommutativeMultiply, CircleTimes соответственно.

Возможно, вам следует попытаться создать нечто подобное. Итак, начните с

BigDot[A_, B_] := Which[
          (MatrixQ[A] || VectorQ[A]) &&  (MatrixQ[B] || VectorQ[B]), A.B, 
         !(MatrixQ[A] || VectorQ[A]) &&  (MatrixQ[B] || VectorQ[B]), A@B, 
          (MatrixQ[A] || VectorQ[A]) && !(MatrixQ[B] || VectorQ[B]), Transpose[B@Transpose[A]],
          True, HoldForm[BigDot[A, B]]];

Обратите внимание, что я добавил последнюю строку в качестве универсального, когда ни A, ни B не являются матрицей или вектором.

Затем создайте часть обозначения инфикса. Трудным путем было бы сделать некоторые определения MakeExpression и MakeBoxes. Самый простой способ - использовать NotationPackage

Needs["Notation`"]
InfixNotation[ParsedBoxWrapper["\[FilledSmallCircle]"], BigDot]
4 голосов
/ 20 июля 2011

Попробуйте (просто вырезайте и вставляйте это):

Needs["Notation`"]

Notation[ParsedBoxWrapper[
RowBox[{"A_", " ", "\[FilledSmallCircle]", " ", 
     "B_"}]] \[DoubleLongLeftRightArrow] ParsedBoxWrapper[
RowBox[{"Which", "[", 
RowBox[{
RowBox[{
RowBox[{"(", 
RowBox[{
RowBox[{"MatrixQ", "[", "A_", "]"}], "||", 
RowBox[{"VectorQ", "[", "A_", "]"}]}], ")"}], "&&", 
RowBox[{"(", 
RowBox[{
RowBox[{"MatrixQ", "[", "B_", "]"}], "||", 
RowBox[{"VectorQ", "[", "B_", "]"}]}], ")"}]}], ",", 
RowBox[{"A_", " ", ".", "B_"}], ",", 
RowBox[{
RowBox[{"!", 
RowBox[{"(", 
RowBox[{
RowBox[{"MatrixQ", "[", "A_", "]"}], "||", 
RowBox[{"VectorQ", "[", "A_", "]"}]}], ")"}]}], "&&", 
RowBox[{"(", 
RowBox[{
RowBox[{"MatrixQ", "[", "B_", "]"}], "||", 
RowBox[{"VectorQ", "[", "B_", "]"}]}], ")"}]}], ",", 
RowBox[{"A_", "[", "B_", "]"}], ",", 
RowBox[{
RowBox[{"(", 
RowBox[{
RowBox[{"MatrixQ", "[", "A_", "]"}], "||", 
RowBox[{"VectorQ", "[", "A_", "]"}]}], ")"}], "&&", 
RowBox[{"!", 
RowBox[{"(", 
RowBox[{
RowBox[{"MatrixQ", "[", "B_", "]"}], "||", 
RowBox[{"VectorQ", "[", "B_", "]"}]}], ")"}]}]}], ",", 
RowBox[{"Transpose", "[", 
RowBox[{"B_", "[", 
RowBox[{"Transpose", "[", "A_", "]"}], "]"}], "]"}]}], "]"}]]]

Теперь я ввел это с палитрой Notation, так что на самом деле это выглядит так: enter image description here (палитра вставляетразличные коробки, где это необходимо).Это выглядит ужасно, когда я вырезал и вставлял из-за явного строкового представления всего.

РЕДАКТИРОВАТЬ: То есть: type "Needs["Notation "]`, вызывая появление палитры. Нажмите на первую кнопку, после чегоэто

enter image description here

* 1013. * Внутри первого желтого поля типа A_ \[FilledSmallCircle] B_, а во втором
Which[(MatrixQ[A_]||VectorQ[A_])&&(MatrixQ[B_]||VectorQ[B_]),A_ .B_,!(MatrixQ[A_]||VectorQ[A_])&&(MatrixQ[B_]||VectorQ[B_]),A_[B_],(MatrixQ[A_]||VectorQ[A_])&&!(MatrixQ[B_]||VectorQ[B_]),Transpose[B_[Transpose[A_]]]]

Результат выглядит следующим образом enter image description here

и при оценке определяет, что вы хотите. В качестве альтернативы, после бита Needs просто вырежьте и вставьте то, что я дал выше.

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

Mathematica имеет некоторые операторы без встроенных определений, таких как CirclePlus и CircleTimes, которые вы можете определить. Сейчас я айфон, поэтому я не могу проверить, но я предполагаю, что FilledSmallCircle - это просто символ, а не оператор. Это не так просто определить как оператор, но вы можете проверить пакет нотаций.

...