私はクラスのインスタンスを持っており、それを関数mexCallMATLAB
を使って関数に渡したいと思います。"mwArray *"と "mxArray *"の間でデータを転送するにはどうすればよいですか?
クラスはもともとMatlabにありますが、データはC++ラッパーに入っているので、私はこのapproachを使用してデータをパックしました。したがって、最終オブジェクトのタイプはmwArray
(見た目のリンクとMatlabにあるGlobalData
クラスとC++にあるglobals
インスタンスです)。しかし、mexCallMATLAB
関数はmxArray *
を使用します。
mwArray *
からmwArray *
にデータを転送するにはどうすればよいですか?タイプがシンプルであれば、手動で転送するのが簡単です。たとえば、mxArray
の倍精度配列を作成し、手動でデータをコピーします。しかし、この状況では、データは複数のデータフィールド/タイプのクラスです。
より一般的には、C++ラッパーからどのようにクラスをMatlab関数に渡すことができますか?
が、これはこれは私がmcc
を経由してコンパイルしてラップクラスに使用MATLAB関数であるMatlabの
classdef GlobalData < handle
properties
val1
val2
val3
end
end
内のクラスであると仮定します。
function globals = create_globals()
globals = GlobalData();
globals.val1 = 2;
globals.val2 = 5.25;
globals.val3 = 'data name';
end
これはデータを持つC++コードです。ここでは前の方法を使ってGlobalDataのインスタンスを作成し、それをMatlab関数myCallback
に渡します。
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
// ...
mwArray globals;
try {
// Pack data to a single Container class of type GlobalData
create_globals(1, globals);
} catch (const mwException& e) {
cerr << e.what() << endl;
return;
} catch (...) {
cerr << "Unexpected error thrown" << endl;
return;
}
int nlhs1 = 1, nrhs1 = 2;
mxArray *plhs1[1], *prhs1[2];
// First parameter of myCallback set to a arbitrary double value
prhs1[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
*mxGetPr(prhs1[0]) = .6;
// Here prhs1[1] must set to globals
// ??? prhs1[1] = globals ???
mexCallMATLAB(nlhs1, plhs1, nrhs1, prhs1, "myCallback");
// ...
}
コードを表示してください。私は霊的ではない。 –
これはタイプミスですか? "mwArray *をmwArray *に変換するにはどうすればいいですか?" –
@RichardCrittenつまり、mwArrayの型が 'int'や' double'のような単純なデータ型ではないクラスである場合、mwArrayをmxArrayにコピーする方法を意味します。 –