3

質問の背後にある理由

物理プロジェクトでは、2つのサーフェス(頂点の束で指定)を分析し、それらのサーフェス間の体積を計算します。これを可能にするために、2次元の区間探索木を実装したいと思います。合計すると、漸近実行時間はO(n 2 log n)に近くなります。

質問

要約すると、非常に時間のかかるアルゴリズムを実装します。さらに、このアルゴリズムは、MATLABの高度に最適化された数学ライブラリから利益を得ることができません。したがって、matlabからJavaを呼び出すことを検討しています。結論として、私たちは知りたいです:

「Javaはmatlabよりもどの程度高速であり、matlabの数学ライブラリから高度に最適化されたパフォーマンスを無視していますか?」

「MATLABからJavaメソッドを繰り返し呼び出すときに、大きな遅延はありますか?」

たとえば、メソッドが呼び出されるたびにJVMを起動する必要がありますか?メソッドが呼び出されるたびにjarをロードする必要がありますか?

私はあなたの何人かがこの質問で私(そして多分他の人)を助けてくれることを願っています。

4

4 に答える 4

2

私はこれまで、MATLABコマンドライン内からJavaクラスを数回操作しました。Java呼び出しを行うたびにJVMが再起動されるかどうかもわかりません。また、スタンドアロンJavaクラスの実行と比較してどれだけの遅延があるかを測定していません。しかし、私はまったく遅さを「感じ」ていません。

問題に合わせてカスタムデータ構造を作成する必要があるようです。これは、MATLABでは簡単または効率的に行うことはできません。どちらを使用するかを決定するのに役立つもう1つの質問は、Javaを使用するかMatlabを使用するかによって開発が速くなるかどうかです。これに対する答えがJavaである場合、私は間違いなくJavaを使用することをお勧めします。

于 2012-05-27T07:47:53.490 に答える
1

この問題は、並列処理に非常に適しているようです。そもそもJavaが唯一の選択肢であるのはなぜですか?最初のコードのパフォーマンスを確認し、必要に応じて、MATLABの組み込みGPU機能のいくつかを使用することを検討する必要があると思います。

于 2012-05-27T19:59:14.540 に答える
1

MATLABで実装を作成することにした場合、MATLABでのOOPパフォーマンスに関する優れた回答で@AndrewJankeが行ったいくつかの非常に良い点があります(投稿全体を読む価値があります)。

MATLABでC++またはJavaクラスを模倣することは、おそらく最適ではありません。Java / C ++クラスは通常、オブジェクトが可能な限り具体的な最小の構成要素(つまり、多数の異なるクラス)になるように構築され、配列やコレクションオブジェクトなどで構成し、ループを使用して反復します。高速なMATLABクラスを作成するには、そのアプローチを裏返しにします。フィールドが配列であるより大きなクラスを持ち、それらの配列でベクトル化されたメソッドを呼び出します。

重要なのは、言語の長所(配列処理、ベクトル化された数学)に合わせてコードを調整し、弱点を回避することです。

あなたの質問に答えるために、そして私はドキュメントを引用します:

MATLABの起動時に、MATLAB仮想アドレス空間の一部はJava仮想マシン(JVM)によって予約されており、MATLAB配列の格納には使用できません。

したがって、起動時に1回だけ初期化されます。

また、MファイルではなくJavaメソッドを呼び出すときにオーバーヘッドが発生します(MATLAB型はJavaデータ型との間でマーシャリングする必要があるため)。

ここで、パフォーマンスの最後のビットをすべて絞り出したい場合は、Javaメソッドを次のように呼び出すようにしてください。

func(obj)

それ以外の:

obj.func()
于 2012-05-27T22:46:22.950 に答える
0

最も簡単に思える方法でプロトタイプを実装してみて、それがどれだけうまく機能するかを確認することをお勧めします。パフォーマンスが明らかに十分でない場合は、別のアプローチを試して、パフォーマンスが優れているかどうかを確認してください。

(実際の答えは問題の詳細と設計に大きく依存することが多いため、このようなことについて一般的な予測を行うのは難しい場合があります。一方、十分なスピードアップが得られない場合があります。努力を正当化するためのおそらくより効率的なアプローチ。)

于 2012-05-27T07:48:10.797 に答える