Каков наиболее эффективный способ возврата больших массивов в структуре C из mex-функции Matlab C?

У меня есть программа, которая создает структуру C, содержащую большие массивы различных базовых типов данных (двойные целые числа и т. д.). Каков наиболее эффективный для меня способ вернуть эти данные в Matlab из mex-функции C, а также тщательно позаботиться обо всем освобождении памяти? В идеале хотелось бы вернуть всю структуру, но допустимы и методы возврата каждого массива по отдельности.

Вы также можете предположить, что я понимаю основы написания mex-функций и возврата аргументов, используя базовый метод копирования данных в массив, на который указывает указатель plhs. Насколько я понимаю, это создаст дубликат памяти, т.е. потребует удвоения памяти, поправьте меня, если это неверно.


person crobar    schedule 21.02.2012    source источник


Ответы (1)


Теперь на мой вопрос ответили на другом форуме массивы-в-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