問題タブ [mathlink]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - MathLink接続からのデータの取得
.NET / Linkプロトコルを使用してMathematica8を呼び出すC#ライブラリ(DLL)を作成しようとしています。具体的には、FFTなどに使用しています。現在、EvaluateToOutputFormを使用して、結果の文字列をdoubleに解析しています。Evaluate()とGetDoubleArray()を使用しようとすると、間違った次元のデータから読み取ろうとしているというエラーメッセージ(例外)が表示されます。Evaluate( "2 + 2")を使用してからGetInteger()を使用しても、待機中のデータが(基本的に)整数ではないというエラーで失敗します。
EvaluateToOutputForm()の問題は、たとえばAbs @ Fourier [data]から解析している数値が、重要な(たとえばかなり長い)入力に対して間違っていることです。何が悪いのかわかりません。ここの誰かが私を助けることができますか?
c# - MathLinkの関数にオプションを入れる方法
これは私の以前の質問に関連していますが、異なります。Evaluate()などを使用せずにMathLink関数オプションを指定する方法を理解できません。たとえば、次のC#コードがあります。
動作しません。これは、FourierParameters部分をオプションではなく、リテラル文字列として配置します。その文字列を使用してExprを作成し、それを配置しようとしましたが、それも失敗しました。これは.NETLinkでも可能ですか?
c# - MathLink での ComplexType の設定
私は別のものを持っています。Mathematica MathLinkを使用ml.ComplexType = System.Type.GetType("Complex");
して C# で使用しようとしましたが、GetComplexArray で数値を読み取ろうとすると、IMathLink.SetComplexType()
存在しないように見えるメソッドを使用する必要があることを示す例外がスローされました。
文字列を解析せずにこれを行う方法はありますか?
wolfram-mathematica - Mathlinkのメモリ使用量の累積
私は、アプリケーションMathLink
から独立したmma式を文字列として送受信するために使用します。C++
MLDisownString
使用済みのメモリは解放されないことを除いて、解放されると思います。
何か案は?
c++ - Mathematica: MathLink エラーメッセージ
C/C++ で記述された関数をMathematicaにリンクする方法を理解し始めていると思います。私が直面している問題は、C ラッパーから Mathematica にエラー メッセージを送信する方法がわからないことです。Google で検索した後、このMathLink Tutorialを見つけました。
セクション 1.7 で、エラー メッセージを送信する方法についての洞察が得られましたが、奇妙な結果が得られています。ここに私が取り組んでいるコードがあります。
ファイル cppFunctions.h は、クラスPoint
とLine
. Mathematicaで使用したい関数を除いて、このクラスを最小限に抑えました。ある線から別の線までの距離を見つけたい。この関数は Mathematica のlineInt
in wireframesの C バージョンです。この関数をMathematicaで使用するには、 Mathematicaから入力を取得し、出力をMathematicaに送り返すラッパー関数が必要です。
Mathematicaからの入力を取得するために、ML_GetPoint
との2 つのヘルパー関数を作成しました。2 つのリストを含むリストから行を取得します。各サブリストは、2 つの実数 (点) のリストです。Mathematica でこの関数を試すには、さらにファイルが必要です。ML_GetLine
このファイルには、関数 LineDistance が引数を手動で取得し、実数を返すことが記載されています。最後の 2 行が重要です。1 つ目は、関数の をEvaluate
宣言しusage
ます。をMathematica?LineDistance
に入力すると、関数に関する簡単なメッセージが表示されます。もう1 つは、エラーが発生したときに使用したいものです (これについては後で詳しく説明します)。Evaluate
最後のファイルは Makefile です。この時点で、Mathematica で関数をテストする準備が整いました。
Mac OS X を使用していることを前に述べておく必要がありましたが、これが Windows でどのように機能するかはわかりません。mlwrapper.cpp では、メイン関数にさらに多くのコードが必要です。これはMathematicaが提供する例の 1 つに見られます。
私が知っている端末でこれを行う:
これにより、実行可能ファイルが作成されますmlwrapper
。これで Mathematica を使い始めることができます:
]
得られる出力は次のとおりです。
正しい引数を入力する限り、すべて正常に機能します。つまり、2 つのリストがあり、それぞれが 2 つの double の 2 つのリストのリストです。入力を取得する別の方法があるかもしれません。方法を知っている場合は、私に知らせてください。この方法に固執する場合、必要なのはMathematicaユーザにエラーがあるかどうかを知らせる方法だけです。非常に単純なものは、間違った入力を入力することです。これを入力するとしましょう:
出力は$Failed
です。以下はどうでしょう。
出力はLineDistance[{{1, -1}, {1, 1}}]
です。Pattern
のセクションで、関数が 2 つのリストを受け入れることを説明したため、これが発生したと推測し.tm
ています。これは本当ですか?
いずれにせよ、私が見つけたチュートリアルに従って、ファイル mlwrapper.cpp を次のように変更します。
mlwrapper.tm ファイルの末尾に次を追加します。
make を使って、Mathematica で間違いを犯してみましょう。
すべてを書くのではなく、どの出力のスクリーンショットを投稿しています。
呼び出しを繰り返すと、さまざまなエラーが発生することに注意してください。エラーが発生した次の行で機能が継続しているようです。関数のような他の ML 関数を使用せず、エラー タグを送信するためML_Attempt
だけに使用するMLEvaluate
場合、MathLink が壊れているため、リンクを再インストールする必要があります。CからMathematicaにエラー メッセージを送信する方法を知っている人はいますか?
アップデート:
与えられた回答と別の有用なドキュメント(第 8 章) に基づいて、なんとか機能させることができました。現時点ではコードはそれほどきれいではありませんが、これにより、次の質問をするようになりました。機能を早期に終了することはできますか? 通常の C プログラムでは、エラーが発生した場合、エラー メッセージを出力してexit
関数を使用します。似たようなことはできますか?この機能を使用するexit
と、リンクが壊れ、機能を再インストールする必要があります。たとえば、関数ML_GetPoint
を取り上げます。ML_GetLine
ここでエラーが発生した場合、main 関数で計算を実行しても意味がありませんLineDistance
。取得したエラーをすべてクリアし、エラーを指定して Mathematica にメッセージを送信し、いったん終了して次の呼び出しを待つ必要があります。
c - 異なる構造を持つ MathLink 関数リストを渡す
私は、2 つのリストを受け入れる関数を使用して、MathLink アプリケーションを開発しています。
手動で関数に引き込むつもりでした。どちらのリストも実数または複素数のいずれかであり、いずれかのパラメーターが複素数の場合、結果は複素数になります。さらに、fi
正方行列のリストにすることもできますがzi
、1 次元のリストのままです。
MathLink C API内で使用する最も単純な関数は、配列の最も内側にあるようにMLGetReal64Array
、実数と複素数の両方のデータ型を処理できる関数です。また、複雑さが決定されたら、必要に応じて配列をC99 複合型にキャストできます。現在、は non-rectangular を処理しないため、各要素は他の要素の次元を持ち、同じ型 (実数または複素数) である必要があります。ただし、奇妙なことに、単一のパラメーターを受け入れる関数では、最も外側の要素として1 つの要素を持つデータ構造が返されます。つまり、C 側で return を入力します。Complex
Head
std::complex<double>
MLGetReal64Array
Lists
List
List
MLGetReal64Array
List
h[ {1, 3, 5} ]
List[List[1,3,5]]
のような 2 つのリスト関数の場合g
、 を 1 回呼び出すと、MLGetReal64Array
両方のパラメータが同時に返されます。つまり、 receive が返されg
ますList[ zi, fi ]
。構造と要素の型を統一するために各リストを前処理する予定なので、両方の要素の型が同じであることを確認しても問題ありません。fi
しかし、行列のリストにしたいのですMLGetReal64Array
が、MLEGSQ: MLGet() called out of sequence
エラーが発生します。
だから、私の質問は: を使用MLGetReal64Array
して両方のリストを取得できますか? どうすればいいですか?そして、私が使えない場合MLGetReal64Array
、私の代替手段は何ですか?
MLGetReal64Array
構造が正しければ、各パラメーターに使用できるようにすることで、外側List
をリンクから外すことができると考えています。今のところ、まだ試していません。しかし、それまでの間、何か提案をいただければ幸いです。MLGetFunction
MLGetReal64Array
wolfram-mathematica - Mathlink と遅延評価/変数
小さなmathlinkモジュールを介してMathematicaで使用しているFortranで書かれたスカラー関数があります。この関数は、記号定数の処理を含めて、ネイティブの Mathematica 関数にできるだけ近い動作をしたいと考えています。
多くの場合、後で置換規則のリストに置き換えられるシンボリック定数/変数を使用して、Mathematica で何らかの式を記述したいと考えています。しかし、Mathematica はシンボリック引数を指定して mathematica 関数をすぐに評価しようとしますが、明らかに失敗します。たとえば、次の単純な式でも失敗します
すべてのシンボリック引数が数値に置き換えられるまで、関数の評価を遅らせる方法はありますか?
私が使用して成功したあまり洗練されていない方法の 1 つ (ただし、この関数を汎用の mathematica パッケージに含めて同僚と共有したい場合は受け入れられません) は、外部関数への「ダミー」参照を使用してすべてを評価し、次に使用することです。他のすべての数値定数を評価すると同時に、すべてのダミー参照を実際の参照と交換する置換規則。例えば
wolfram-mathematica - MathematicaでFORTRANサブルーチンまたは関数を使用するにはどうすればよいですか?
MathematicaセッションでFortranコードを呼び出すことに興味があります。Mathlinkがそれを行う方法を提供していることを学びました。しかし、私はCについてほとんど知識がなく、C++については何も知りません。誰かが私に詳細な例を教えてくれますか?
私はMathematica8、MS Visual Studio 2008、IntelFortran11で使用しています。システムはWindows7HomePremiumです。
どうもありがとう!
c - 外部の数学関数を割り込み可能にする方法は?
MathematicaをC++で書かれた関数と統合することについて以前に質問がありました。
これはフォローアップの質問です:
計算に時間がかかりすぎる場合は、[評価]>[評価の中止]を使用して計算を中止できるようにしたいと思います。回答で提案されているテクノロジーのうち、割り込み可能なCベースの拡張機能を使用できるのはどれですか?C側で「割り込み性」をどのように実装できますか?
関数もMathematicaカーネルも破壊しない方法で関数を割り込み可能にする必要があります(つまり、関数が中断された後、Mathematicaから関数を再度呼び出すことができるはずです)
interop - 任意のPATH環境でMathLinkプログラムをインストールします
Install[]
カスタムPATH
環境変数を使用してMathLinkプログラムを開始するために使用することは可能ですか?
WindowsでMathematicaをMATLABに接続するためにmEngineを使用しようとしています。これは、環境変数にMATLABライブラリへのパスが含まれているmEngine.exe
ときに起動された場合にのみ機能します。システムパスを変更せずに、PATH
このプログラムを起動するためだけにPATHを変更することは可能ですか?または、起動する別の方法はありmEngine.exe
ますか?