Теперь на мой вопрос ответили на другом форуме массивы-в-ac-структуре-из-a-matlab-c-mex-fu" rel="nofollow">здесь. Ниже приведен ответ:
«Вы не можете смешивать родную память C/C++ (т. е. локальные переменные стека или выделенные переменные с malloc и кузенами) в mxArray для возврата в рабочее пространство MATLAB. Это в конечном итоге приведет к сбою MATLAB, когда он попытается освободить эту память. Таким образом, вы застряли с дублированием этой памяти.Как я вижу, ваши варианты:
1) Перепишите свой код, чтобы создать структуру C/C++, используя функции MATLAB API mxMalloc и родственники вместо родных функций C/C++ malloc и друзей. Затем эту память можно было бы напрямую присоединить к структуре mxArray для возврата в рабочее пространство MATLAB... дублирование или освобождение не потребуется.
2) Создайте свою структуру MATLAB по частям с помощью mxMalloc и кузенов, поскольку вы освобождаете память C/C++ по частям. Это по-прежнему потребует от вас временного дублирования самого большого блока, но избавит вас от одновременного дублирования всего в памяти.
3) Не обращайте внимания на то, что я сказал о смешивании родной памяти C/C++ и памяти MATLAB API. Играйте в игры со взломом массива mxArray, чтобы смешивать их, храните их общие копии данных внутри подпрограммы mex, чтобы предотвратить попытки MATLAB освободить память. Это очень сложно и не рекомендуется, так как вы можете легко утечь память и/или MATLAB, если вы не управляете всем правильно.
Это не сэкономит вам значительного объема памяти, возвращая несколько отдельных переменных в MATLAB по сравнению с возвратом структуры или массива ячеек, поэтому просто возвращайте то, что легче создать и управлять в зависимости от вашего предполагаемого использования», — Джеймс Турса.
person
Community
schedule
21.02.2012