0

私の質問は、Matlab と私の C++ コードをプログラムして対話できるようにする方法についてです。具体的には、データを処理し、オブジェクトを作成し、そのオブジェクトの統計を取得し、mat ファイルに書き込む C++ プログラムがあります。次に、それを matlab にロードして、さらに分析と視覚化を行います。ただし、データを処理してオブジェクトを作成するのにかかる時間は膨大ですが、統計を導出する時間はごくわずかです。一方、多くの統計とそれらのさまざまな組み合わせがあり、どの組み合わせを使用するかを予測することは困難です。そのため、データを処理する作業を繰り返さずに、「統計」の部分を対話的に何度も実行できることを願っています。

私の質問は次のとおりです。Matlab に次のことを依頼できますか? 1. c++ コードを呼び出します。2. データを処理してオブジェクトを作成した後、そのオブジェクトをメモリ内で「有効」に保ちます。 3. C++ コードを再度呼び出して、統計をワークスペースにロードするように要求します。4. 異なる統計で 3 を繰り返します。ありがとう

4

2 に答える 2

3

さらなるオプションとして、MEX 関数で C++ クラス インスタンスを作成し、そのポインターを MATLAB に返し、そのポインターを後続の呼び出しに渡すことができます。この方法を使用する場合は、デストラクタで適切にメモリをクリーンアップできるように、MATLAB ハンドル クラス ラッパーも作成する必要があります。これは、投稿者がそれを行うようにアドバイスされた投稿です。これは、Mathworks FileExchange での方法の例です

この方法を問題に適用できるかどうかは、問題の複雑さによって異なります。個人的には、問題が他のアプローチでは手に負えないほど複雑な場合 (たとえば、ライブラリの C++ クラスを使用する必要があり、呼び出し間でインスタンスを存続させる必要がある場合、またはグローバル変数がそのトリックを実行できない場合) にのみ、このルートをたどります。多くのインスタンスを追跡する必要があり、これは当然、懸念事項を適切に分離できる C++ クラスの配列によって最もよく表されます)。

于 2013-03-29T13:29:03.760 に答える
1

これを実現する 1 つの方法は、再度アクセスする変数をc++ mex コードでグローバルとして宣言することです。これらの変数はメモリ内に残り、mex 関数をクリアするか、Matlab セッションを閉じるまで、(mex 関数を呼び出したときに) 再度アクセスできます。この目的のためにグローバル変数を使用しましたが、それは私にとってはうまくいきました。

もう 1 つのオプションは、永続変数を使用することです。ドキュメントから

MATLAB® ソフトウェアは両方に対して永続的なストレージを作成するため、永続変数はグローバル変数に似ています。永続変数は、それらが宣言されている関数にのみ認識されるという点で、グローバル変数とは異なります。これにより、永続変数が他の関数または MATLAB コマンド ラインから変更されるのを防ぎます。

于 2013-03-29T13:25:54.550 に答える