6

大規模な Matlab データ構造に繰り返しアクセスする必要がある C プログラムに取り組んでいます。これは、OpenGL を使用したグラフィックを多用するプログラムであるため、高速である必要があります。

Matlab エンジンでこのデータ構造に繰り返しアクセスすると、時間がかかりすぎるようです (engGetVariable と engPutVariable の呼び出しごとに約 10 ~ 20 ミリ秒)。これは、これらの関数がデータをメモリにコピーするためだと思います。

したがって、データ構造自体で engGetVariable を使用する代わりに、データ構造へのポインターを取得しようとしています。ポインターで engGetVariable を呼び出すと、最初にメモリ内のデータをコピーしなくても、ポインターを逆参照することで C のデータ構造にアクセスできます。しかし、これまでのところこれを機能させることができませんでした。このようなことは可能ですか?

// Make vars in matlab workspace
engEvalString(ep, "a=9");
engEvalString(ep, "ap=getPointer(a)");

// Get variables in C
ap = engGetVariable(ep, "ap");
a = *mxGetPr(ap);

printf("a = %f", a);
4

1 に答える 1

3

MATLAB エンジンは、プログラムとは別のプロセスとしてバックグラウンドで動作し、独自のアドレス空間を持ちます。したがって、別のプロセスのメモリ内のデータへのポインターは問題外であり、唯一のオプションは、ある種のIPCメカニズムを使用して通信することです。

Windows では、エンジン API はCOMインターフェイスに基づいていますが、UNIX システムでは、エンジンはパイプに基づいています( を使用して、リモート マシンに対して実行することもできますrsh)。

engGetVariableしたがって、公開されている関数を使用してデータengPutVariableを交換するしかありませんengGetVariable。を使用して MATLAB にコピーします。mxArraymxGetDataengPutVariable

于 2014-10-09T23:18:52.360 に答える