Matlab: избегая выделения памяти в mex - PullRequest
3 голосов
/ 10 ноября 2009

Я пытаюсь сделать так, чтобы моя mex-библиотека избегала выделения памяти, даже если так.
До сих пор мекс получил вход, создал несколько матриц, используя mxCreate...(), и возвратил этот вывод.
Но теперь я хотел бы изменить этот интерфейс, чтобы сам мекс не делал никаких выделений.
Я имел в виду, что функция mexFunction будет получать в качестве входных данных матрицу для заполнения значений и возвращать эту самую матрицу в качестве выходных данных.

Это должно быть возможно?

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

Ответы [ 2 ]

5 голосов
/ 12 ноября 2009

Как ни странно, я просто смотрел на это на днях. Лучшая информация, которую я нашел, была темы здесь и здесь , а также это .

По сути, это обычно считается очень плохой вещью в мире Matlab ... но в то же время ничто не останавливает вас, чтобы вы могли это сделать - попробуйте несколько простых примеров, и вы увидите, что изменения распространены. Просто внесите изменения в данные, полученные из prhs (вам не нужно ничего возвращать - поскольку вы изменили необработанные данные, они будут отражены в переменной в рабочей области).

Однако, как указано в ссылках, это может иметь странные последствия из-за семантики копирования при записи Matlabs. Настройка format debug может очень помочь с интуицией. Если вы сделаете a=b, то вы увидите, что a и b имеют разные «структурные адреса» или заголовки, представляющие тот факт, что они являются разными переменными, но указатель данных pr указывает на одну и ту же область в памяти. Обычно, если вы изменяете y в Matlab, происходит копирование при записи, и область данных копируется перед изменением, поэтому после y появляется новый указатель данных. Когда вы меняете вещи в mex, этого не происходит, поэтому, если вы изменили y, x также изменится.

Я думаю, что это нормально - это невероятно полезно, если вам нужно обрабатывать большие наборы данных, но вам нужно следить за любыми странностями - старайтесь убедиться, что вводимые вами данные не распределяются между переменными. Вещи становятся еще более сложными со структурой и массивами ячеек, поэтому я был бы более склонен избегать этого с ними.

5 голосов
/ 11 ноября 2009

Изменение правых аргументов было бы плохой идеей. Эти входы могут быть подсчитаны по ссылкам, и если вы измените их, когда счетчик ссылок больше единицы, то вы будете молча изменять значение, сохраненное и в других переменных.

К сожалению, я не верю, что есть способ сделать то, что вы хотите, используя существующий MEX API.

...