Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

C++ MEX 소스 파일 만들기

여기에서는 기본 C++ MEX 함수를 만드는 방법을 설명합니다. 이 함수는 입력 배열의 각 요소에 오프셋을 추가하여 기본 입력값과 출력값을 보여줍니다. MEX 함수 소스 코드를 만드는 방법에 대한 자세한 내용은 Structure of C++ MEX Function 및 관련 항목을 참조하십시오.

소스 파일 만들기

편집기를 사용하여 .cpp 확장자를 갖는 파일을 만들고 관련 지침을 주석으로 추가합니다. 예를 들면 MyMEXFunction.cpp와 같습니다.

/* MyMEXFunction
 * Adds second input to each  
 * element of first input
 * a = MyMEXFunction(a,b);
*/

필수 헤더 파일 추가하기

C++ MEX 함수의 경우 다음과 같은 헤더 파일을 추가하십시오.

/* MyMEXFunction
 * Adds second input to each  
 * element of first input
 * a = MyMEXFunction(a,b);
*/

#include "mex.hpp"
#include "mexAdapter.hpp"

편의 함수 정의 사용하기

선택적으로 matlab::data에 대한 네임스페이스를 지정하고 다른 편의 함수를 정의합니다.

/* MyMEXFunction
 * Adds second input to each  
 * element of first input
 * a = MyMEXFunction(a,b);
*/

#include "mex.hpp"
#include "mexAdapter.hpp"

using namespace matlab::data;
using matlab::mex::ArgumentList;

MexFunction 클래스 정의하기

모든 C++ MEX 함수는 MexFunction이라는 클래스로 구현됩니다. 이 클래스는 matlab::mex::Function에서 파생되어야 합니다.

/* MyMEXFunction
 * Adds second input to each  
 * element of first input
 * a = MyMEXFunction(a,b);
*/

#include "mex.hpp"
#include "mexAdapter.hpp"

using namespace matlab::data;
using matlab::mex::ArgumentList;

class MexFunction : public matlab::mex::Function {

};

operator() 정의하기

모든 MexFunction 클래스는 유형 matlab::mex::ArgumentList의 인수 두 개를 받도록 함수 호출 연산자 operator()를 재정의해야 합니다. 이러한 인수는 입력값과 출력값을 포함합니다.

/* MyMEXFunction
 * Adds second input to each  
 * element of first input
 * a = MyMEXFunction(a,b);
*/

#include "mex.hpp"
#include "mexAdapter.hpp"

using namespace matlab::data;
using matlab::mex::ArgumentList;

class MexFunction : public matlab::mex::Function {
public:
    void operator()(ArgumentList outputs, ArgumentList inputs) {

    }

};

인수 확인을 위한 멤버 함수 추가하기

인수의 유형과 크기가 올바른지를 테스트합니다. 테스트에 실패하면 MATLAB® error 함수를 호출합니다.

/* MyMEXFunction
 * Adds second input to each  
 * element of first input
 * a = MyMEXFunction(a,b);
*/

#include "mex.hpp"
#include "mexAdapter.hpp"

using namespace matlab::data;
using matlab::mex::ArgumentList;

class MexFunction : public matlab::mex::Function {
public:
    void operator()(ArgumentList outputs, ArgumentList inputs) {

    }
    void checkArguments(ArgumentList outputs, ArgumentList inputs) {
        // Get pointer to engine
        std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine();

        // Get array factory
        ArrayFactory factory;

        // Check first input argument
        if (inputs[0].getType() != ArrayType::DOUBLE ||
            inputs[0].getNumberOfElements() != 1)
        {
            matlabPtr->feval(u"error",
                0,
                std::vector<Array>({ factory.createScalar("First input must be scalar double") }));
        }

        // Check second input argument
        if (inputs[1].getType() != ArrayType::DOUBLE)
        {
            matlabPtr->feval(u"error",
                0,
                std::vector<Array>({ factory.createScalar("Input must be double array") }));
        }
        // Check number of outputs
        if (outputs.size() > 1) 
        {
            matlabPtr->feval(u"error",
                0,
                std::vector<Array>({ factory.createScalar("Only one output is returned") }));
        }
    }
};

계산 구현하기

스칼라 오프셋을 받은 후 const double에 할당합니다. 입력 배열을 받은 후 배열에서 작업할 수 있도록 matlab::data::TypedArray<double>로 이동합니다. 배열의 각 요소에 오프셋을 추가하고 수정된 배열을 출력 변수에 할당합니다.

/* MyMEXFunction
 * Adds second input to each  
 * element of first input
 * a = MyMEXFunction(a,b);
*/

#include "mex.hpp"
#include "mexAdapter.hpp"

using namespace matlab::data;
using matlab::mex::ArgumentList;

class MexFunction : public matlab::mex::Function {
public:
    void operator()(ArgumentList outputs, ArgumentList inputs) {
        checkArguments(outputs, inputs);
        const double offSet = inputs[0][0];
        TypedArray<double> doubleArray = std::move(inputs[1]);
        for (auto& elem : doubleArray) {
            elem += offSet;
        }
        outputs[0] = doubleArray;
    }

    void checkArguments(ArgumentList outputs, ArgumentList inputs) {
        // Get pointer to engine
        std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine();

        // Get array factory
        ArrayFactory factory;

        // Check first input argument
        if (inputs[0].getType() != ArrayType::DOUBLE ||
            inputs[0].getType() == ArrayType::COMPLEX_DOUBLE ||
            inputs[0].getNumberOfElements() != 1)
        {
            matlabPtr->feval(u"error",
                0,
                std::vector<Array>({ factory.createScalar("First input must be scalar double") }));
        }

        // Check second input argument
        if (inputs[1].getType() != ArrayType::DOUBLE ||
            inputs[1].getType() == ArrayType::COMPLEX_DOUBLE)
        {
            matlabPtr->feval(u"error",
                0,
                std::vector<Array>({ factory.createScalar("Input must be double array") }));
        }
        // Check number of outputs
        if (outputs.size() > 1) {
            matlabPtr->feval(u"error",
                0,
                std::vector<Array>({ factory.createScalar("Only one output is returned") }));
        }
    }
};

설치 및 빌드하기

지원되는 컴파일러를 설치한 후 mex 명령을 사용하여 MEX 함수를 빌드합니다.

mex -setup c++
mex MyMEXFunction.cpp

MEX 함수 빌드에 대한 자세한 내용은 C++ MEX 프로그램 빌드하기 항목을 참조하십시오.

MEX 함수 호출하기

MATLAB에서 MEX 함수를 호출합니다.

b = MyMEXFunction(11.5, rand(1000));

참고 항목

| |

관련 항목