Main Content

C++ から MATLAB へのスパース配列の引き渡し

MATLAB® スパース配列は、大部分がゼロの double データや logical データを効率的に格納します。MATLAB スパース配列は、算術、論理およびインデックス付け演算をサポートします。詳細については、スパース行列を参照してください。

配列 matlab::data::SparseArray を作成するには、matlab::data::ArrayFactory を使用します。スパース配列用のデータをバッファーに書き込み、これらのバッファーを使用してスパース配列を作成します。MATLABEngine::setVariable を使用してスパース配列を MATLAB に渡します。

#include "MatlabDataArray.hpp"
#include "MatlabEngine.hpp"

void sparseArray() {

    using namespace matlab::engine;

    // Connect to named shared MATLAB session started as:
    // matlab -r "matlab.engine.shareEngine('myMatlabEngine')"
    String session(u"myMatlabEngine");
    std::unique_ptr<MATLABEngine> matlabPtr = connectMATLAB(session);

    // Define the data for the sparse array
    std::vector<double> data = { 3.5, 12.98, 21.76 };
    std::vector<size_t> rows = { 0,0,1 };
    std::vector<size_t> cols = { 0, 4, 8 };
    size_t nnz = 3;

    // Create buffers for the data
    matlab::data::ArrayFactory factory;
    buffer_ptr_t<double> data_p = factory.createBuffer<double>(nnz);
    buffer_ptr_t<size_t> rows_p = factory.createBuffer<size_t>(nnz);
    buffer_ptr_t<size_t> cols_p = factory.createBuffer<size_t>(nnz);

    // Write data into the buffers
    double* dataPtr = data_p.get();
    size_t* rowsPtr = rows_p.get();
    size_t* colsPtr = cols_p.get();
    std::for_each(data.begin(), data.end(), [&](const double& e) { *(dataPtr++) = e; });
    std::for_each(rows.begin(), rows.end(), [&](const size_t& e) { *(rowsPtr++) = e; });
    std::for_each(cols.begin(), cols.end(), [&](const size_t& e) { *(colsPtr++) = e; });

    // Use the buffers to create the sparse array
    matlab::data::SparseArray<double> arr =
        factory.createSparseArray<double>({ 2,9 }, nnz, 
            std::move(data_p), std::move(rows_p), std::move(cols_p));

    // Put the sparse array in the MATLAB workspace
    matlabPtr->setVariable(u"s", arr);
}

MATLAB の whos コマンドで、MATLAB ワークスペースに渡された配列がスパース配列であることが表示されます。

>> whos
  Name      Size            Bytes  Class     Attributes

  s         2x9               128  double    sparse 

C++ エンジン プログラムを設定およびビルドする方法の詳細については、C++ エンジン プログラムのビルドを参照してください。

参考

| |