MATLAB クラス メソッドに対する MEX 関数の使用
MEX 関数を使用して、MATLAB® クラスにメソッドを実装することができます。MEX 関数を使用すると、既存の C++ のアルゴリズムと演算を、MATLAB でコードを書き換えずにクラス メソッドに組み込むことができます。
MEX 関数のメソッドを使用するには、以下を行います。
@
フォルダーで MATLAB クラスを定義し、メソッドを個別のファイルに格納できるようにする。別ファイルのメソッドを参照してください。MEX 関数を実装し、実行可能ファイルをクラス
@
フォルダーに配置する。クラス定義
Methods
ブロックで MEX 関数を参照する。他のメソッドと同じように MEX 関数を呼び出す。
行列をスカラーで乗算するメソッド
ここで定義する arrayMultiplier
クラスは、multiplyAllElements
メソッドを MEX 関数として実装します。
このクラスは 2-D 配列を自身の Data
プロパティに格納します。multiplyAllElements
メソッドはクラス インスタンスとスカラー乗数を入力として受け入れます。このメソッドは、Data
プロパティの配列の要素を乗数で乗算し、その結果を Data
プロパティに代入します。arrayMultiplier
クラスは値クラスであるため、multiplyAllElements
メソッドは変更されたオブジェクトを返します。
以下は arrayMultiplier
クラスの定義です。
classdef arrayMultiplier % An object that contains an array and an operation % to multiply each element of the array by an input % value. % This class demonstrates how to use a MEX function % as a method. properties Data (:,:) double {mustBeNonempty(Data)} = ones(4); end methods function obj = arrayMultiplier(Matrix) % Create object if nargin obj.Data = Matrix; end end % multiplyAllElements method implemented % as a MEX function obj = multiplyAllElements(obj,multplier) end end
以下は、multiplyAllElements
メソッドの C++ MEX 関数実装です。
/* C++ MEX file for MATLAB * returnObj = multiplyAllElements(obj, multiplier) modify object property. * Multiply all elements in obj.Data by multiplier. * * Class method implemented as a MEX function * */ #include "mex.hpp" #include "mexAdapter.hpp" using matlab::mex::ArgumentList; using namespace matlab::data; class MexFunction : public matlab::mex::Function { std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine(); public: void operator()(ArgumentList outputs, ArgumentList inputs) { checkArguments(outputs, inputs); Array object(inputs[0]); double multiplier = inputs[1][0]; assignProperty(object, multiplier); // Return modified object outputs[0] = object; } void assignProperty(Array& obj, double multiplier) { // Get matrix from Data property TypedArray<double> inMatrix = matlabPtr->getProperty(obj, u"Data"); // Multiply matrix by multiplier for (auto& elem : inMatrix) { elem *= multiplier; } // Set the property value matlabPtr->setProperty(obj, u"Data", inMatrix); } void checkArguments(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) { matlab::data::ArrayFactory factory; if (inputs.size() != 2) { matlabPtr->feval(u"error", 0, std::vector<matlab::data::Array>({ factory.createScalar("Two inputs required") })); } if ((inputs[1].getType() != matlab::data::ArrayType::DOUBLE) || (inputs[1].getNumberOfElements() != 1)) { matlabPtr->feval(u"error", 0, std::vector<matlab::data::Array>({ factory.createScalar("Input multiplier must be a noncomplex scalar double") })); } } };
このメソッドを使用するには、クラスのインスタンスを作成します。Data
プロパティの既定値は、式 ones(4)
により返される 4 行 4 列の配列です。
a = arrayMultiplier; a.Data
ans = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
multiplyAllElements
メソッドを使用して、配列の各要素をスカラー値で乗算します。返されたオブジェクトを同じ変数に代入します。
a = multiplyAllElements(a,6.25); a.Data
ans = 6.2500 6.2500 6.2500 6.2500 6.2500 6.2500 6.2500 6.2500 6.2500 6.2500 6.2500 6.2500 6.2500 6.2500 6.2500 6.2500
参考
matlab::data::Array
| mex
| matlab::mex::Function
| matlab::mex::ArgumentList