2011-07-19 10 views
4

Mathematicaで特別な演算子、たとえば特別な種類の加法演算子や乗法演算子を定義するにはどうすればよいですか?私は過去にそれをしましたが、コードをどこに置くかは思い出せません。 私は2つの行列に、この満たされた小さな円のオペレータを定義しようとした:Special Operators Mathematicaの定義

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

をしかし、それは動作しません。私は間違って何をしていますか?

+0

を使用することです[A、ブランク[]]、パターン[B、ブランク[]]] '。中置表記法を作成する必要があります。以下のさまざまな回答を参照してください。 – Simon

答えて

5

これで、中断操作の演算子を作成しようとしています。あなたは組み込みの挿入演算子+***\[CircleTimes]、などと比較した場合...あなたは「」彼らはすべて彼らのFullFormに解釈されることを参照してください。PlusTimesNonCommutativeMultiplyCircleTimesを、それぞれ。

おそらく同様のものを作成しようとする必要があります。だから私はキャッチオールどちらもAもBは行列またはベクトルのときと同様に、最後の行を追加

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

ノートで始まります。

次に、挿入表記部品を作成します。難しい方法は、MakeExpressionMakeBoxesの定義を作ることです。簡単な方法は、 `タイムズ[\ [FilledSmallCircle]、パターンとして(あなたはA_`と` \ [FilledSmallCircle] ``の間にスペースを入れた場合)左手側が解釈されているNotationPackage

Needs["Notation`"] 
InfixNotation[ParsedBoxWrapper["\[FilledSmallCircle]"], BigDot] 
+0

私よりもはるかに優れています – acl

+0

@acl:ありがとう:) – Simon

+0

私は上記の不完全なコメントを提出しているようです...あなたのコードに 'True'がなくなる前にカンマを入れてください(おそらくカットアンドペーストの問題) – acl

2

Mathematicaには、定義できるCirclePlusやCircleTimesのような組み込み定義のない演算子がいくつかあります。私は今iPhoningしているのでチェックできませんが、FilledSmallCircleは単なる文字であり演算子ではないと仮定します。それを演算子として定義することはそれほど簡単ではありませんが、表記パッケージをチェックしたい場合があります。

+0

はい:表記パッケージを確認してください – acl

+0

@sjoerd:FilledSmallCircleは単なる文字であり、演算子ではありません。私はそのキャラクタに定義を提供したいと思います.MathematicaにはCirclePlusやCircleTimesのような組み込み定義のない演算子がいくつかあります。私の質問は、mathematicaに特定のdefを実装する方法です。 – Phil

+0

@Philかもしれないhttp://reference.wolfram.com/mathematica/Notation/guide/NotationPackage.html – acl

4

てみてください(単にカットし、これを貼り付ける):

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 (パレットは様々なボックスを挿入必要)。すべての明示的な文字列表現のために私が切り取って貼り付けると、ちょうど恐ろしいように見えます。

EDIT:それは次のとおりです。タイプ"Needs["Notation「] `、パレットが表示させ、この

enter image description here

最初に表示される黄色のボックスタイプA_ \[FilledSmallCircle] B_ Inside、および内ところ、最初のボタンをクリックします。第二は、

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

のように見えます3210

と評価されたら、あなたが望むものを定義します。あるいは、Needsビットの後に、私が上で与えたものをカットアンドペーストしてください。

+0

ありがとうございます。私はそれを試み、エラーメッセージを出します:Notation :: notapatu:警告:パターンA_。表記ではなく模様として解釈されている。このパターンを本物のパターンとして扱うには、組み込みのNotationPatternTag TemplateBoxラッパーを使用します。 >> – Phil

+0

@Phil申し訳ありませんが、もう一度試してください(最後のコードを切り取って貼り付けてください)。何とか見つからなかった 'A'と' .'の間にスペースを追加しました。 – acl

+0

もう一度やり直してください:同じエラーメッセージ – Phil

関連する問題