Какой самый эффективный способ памяти вернуть большие массивы в C-структуре из C-мекс-функции Matlab? - PullRequest
2 голосов
/ 21 февраля 2012

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

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

1 Ответ

1 голос
/ 21 февраля 2012

На мой вопрос теперь ответили на другом форуме здесь .Ниже дан ответ:

"Вы не можете смешивать собственную память C / C ++ (т. Е. Локальные переменные стека или выделенные переменные с помощью malloc & cousins) в mxArray для возврата в рабочую область MATLAB. Это в конечном итоге приведет ксбой MATLAB, когда он пытается освободить эту память. Таким образом, вы застряли с дублированием этой памяти. Как я вижу, ваши варианты:

1) Перепишите ваш код, чтобы создать структуру C / C ++ с использованием функций MATLAB API mxMalloc& cousins ​​вместо нативных функций C / C ++: malloc & friends. Затем эта память может быть напрямую подключена к структуре mxArray для возврата в рабочую область MATLAB ... дублирование или освобождение не потребуется.

2) Создатьваш фрагмент структуры MATLAB с mxMalloc и двоюродными братьями, когда вы освобождаете фрагмент памяти C / C ++. Это по-прежнему требует временного дублирования самого большого блока, но избавляет вас от дублирования всего в памяти одновременно.

3) Не обращайте внимания на то, что я сказал о смешивании нативного с / к++ память и память MATLAB API.Играйте в игры со взломом mxArray, чтобы смешивать их, сохраняйте копии общих данных в подпрограмме mex, чтобы предотвратить попытки MATLAB освободить память.Это очень сложно и не рекомендуется, так как вы можете легко потерять память и / или вызвать сбой MATLAB, если не все правильно справитесь.

Это не сэкономит вам значительный объем памяти, возвращая несколько отдельных переменных вMATLAB против возврата структуры или массива ячеек, поэтому просто возвращайте все, что проще для создания и управления на основе вашего предполагаемого использования. "-James Tursa

...