Convert Matlab struct into custom C++ type with C++ Mex API

조회 수: 6 (최근 30일)
Friedrich
Friedrich 2024년 10월 25일
편집: 埃博拉酱 2024년 10월 28일
I am trying to mex a custom C++ code file but am struggeling in how to convert the Matlab-Inputs into whatever type I need for my C++ Code.
Let's assume I have a Matlab struct like this
u = struct(test1 = 5, test2 = 10, test3 = struct(test4 = 1:10))
u = struct with fields:
test1: 5 test2: 10 test3: [1x1 struct]
As u see I have a nested struct with an array inside. Now, in the C++ Mex API I need to read all values of the above struct. How do I do this? I tried indexing into the inputs of the operator() method
void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs)
however, that way I could only retrieve the number of inputs but not their numerical contents.
I guess I have to do something like
matlab::data::TypedArray<Struct> in0 = std::move(inputs[0]);
to get to the values but that alone doesn't help me. How do I proceed?

채택된 답변

埃博拉酱
埃博拉酱 2024년 10월 25일
편집: 埃博拉酱 2024년 10월 28일
Usually you should move-construct a StructArray from inputs[0] and index into it to get a Struct element, which can be then indexed with a fieldname as a C++ string to get a generic Array, with which you can then move-construct a TypedArray of correct type (get its real runtime type with Array::GetType if you can't ensure it at coding time). Finally you should usually index into that TypedArray to get a numeric element, get an iterator like cbegin/begin, or release it as a buffer_ptr_t to get a C++ native pointer.
void Example(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs)
{
matlab::data::TypedArray<double> A = matlab::data::StructArray(matlab::data::StructArray(std::move(inputs[0]))[0]["test3"].operator matlab::data::Array())[0]["test4"];
A.cbegin();//Get an iterator
A[0];//Get a double element
const matlab::data::buffer_ptr_t<double> B = A.release();//After this, A becomes invalid
B.get();//Get a native pointer
}
20241028:Edited for forgetting to provide a type to the buffer_ptr_t
  댓글 수: 2
Friedrich
Friedrich 2024년 10월 28일
Thanks @埃博拉酱, that helped!
Is it also possible to move the content of the Array A to a std::vector<double> v?
Just for the sake of completeness, I guess you forgot to provide a type to the buffer_ptr_t. This compiles:
const matlab::data::buffer_ptr_t<double> B = A.release();
埃博拉酱
埃博拉酱 2024년 10월 28일
편집: 埃博拉酱 2024년 10월 28일
No. std::vector does not support moving constructs from types other than vector. Copying is inevitable if you really must get a vector.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Call C++ from MATLAB에 대해 자세히 알아보기

태그

제품


릴리스

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by