Interpreting a struct returned by engGetVariable

1 回表示 (過去 30 日間)
Sean McGhee
Sean McGhee 2011 年 4 月 27 日
Hi,
I am adapting matlab code to run from C++ through the matlab engine and I need to retrieve and put a struct which contains scalars, strings and matrices...
How do I navigate through the struct (returned in an mxArray) once I have it and accordingly how do i put info into various sections?
Is it even possible to manipulate a struct variable once returned?
Thanks, Sean

採用された回答

Chirag Gupta
Chirag Gupta 2011 年 4 月 27 日
You should be able to use mx* struct functions to manipulate and traverse your structure.
bool mxIsStruct(const mxArray *pm)
for example lets you test whether the mxArray is a structure.
Look at the phonebook.c example in MATLABROOT/extern/examples/refbook/
  1 件のコメント
Sean McGhee
Sean McGhee 2011 年 4 月 27 日
Thanks - I rather expected there would be a way but the blurb in the docs about engGetVariable rather left me hanging...
Looks like your answer will help!
Sean

サインインしてコメントする。

その他の回答 (2 件)

James Tursa
James Tursa 2011 年 4 月 27 日
When you retrieve a variable with engGetVariable you are getting a deep copy of the variable from the engine into your program. You can manipulate it all you want and it will not affect the variable in the engine workspace. In the External Interfaces section of the doc, look at mxIsStruct, mxGetField, mxGetFieldByNumber, mxSetField, mxSetFieldByNumber and friends. If you are changing the contents of a currently existing field, be sure to use mxDestroyArray on the current field first or you will get a memory leak. e.g., do something like this:
mx = engGetVariable(etc);
field = mxGetField(etc);
mxDestroyArray(field);
mxSetField(etc);
Also, be careful not to reuse the same variable to set multiple fields or you will risk a program bomb when the variable gets destroyed. There is a way to do this correctly by bumping up the reference count of the variable, but this technique is not officially supported.
James Tursa
  1 件のコメント
Sean McGhee
Sean McGhee 2011 年 4 月 27 日
And thanks to you too - this is proving most helpful...:)
And the response times are amazing!

サインインしてコメントする。


Sean McGhee
Sean McGhee 2011 年 4 月 28 日
I appreciate everyone's help but I am still pulling hen's teeth trying to actually access the data - I might start a new question thread as this one might be closed due to my accepting the answer above (which was quite helpful - no problems there)...
I cannot seem to get data out - i need to see and end to end example of:
1-getting the struct using engGetVariable (already know this part) 2-accessing the desired field (i THINK this works but cannot be sure) 3-actually retrieving the data in the selected field (presumably using mxGetData and some mxCopyTo...routine)
I will look in the other examples in the externals directory but I am doubtful i will find a simple start to finish example of this
Thanks! Sean

カテゴリ

Help Center および File ExchangeManage Products についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by