Ограничение размера в MATLAB MEX-файлах - PullRequest
2 голосов
/ 22 января 2020

Я новичок в Matlab mex. Я пытаюсь написать mex-функцию, которая, в свою очередь, возьмет структурные данные из файла. cpp и использует их в Matlab.

Я узнал, что plhs и prhs являются указателями на массив которые содержат выходные данные и входные данные соответственно, каждый элемент типа mxArray.

Поскольку размер структуры может быть большим, существует ли какой-либо максимальный предел размера для массива plhs и prhs для хранения данных? Если так, каковы альтернативные способы?

1 Ответ

3 голосов
/ 22 января 2020

Насколько я исследовал, размер массивов, которые можно обрабатывать, зависит от API, с которым вы компилируете свои mex-файлы. Вы можете выбрать API, добавив соответствующий флаг в инструкции по компиляции. Подробности в документации Matlab в разделе "API-релиз спецификация c API".

Доступно 4 опции: -R2017b (default) -R2018a -largeArrayDims и -compatibleArrayDims ,

В отношении размера массива -R2017b (default) -R2018a и -largeArrayDims используется API обработки больших массивов, который согласно документации matlab mex может обрабатывать массивы более 2 31 -1 и, согласно документации API должен иметь возможность обрабатывать массивы до 2 48 -1 элементов и разреженные массивы до 2 48 -2.

Только последний параметр, -compatibleArrayDims не будет обрабатывать массивы выше 2 31 -1

Помимо размера массива, эти параметры изменят способ обрабатываются несколько типов данных, заметно сложные типы и графические объекты.

Короче говоря:

  • -R2017b (default): 2 48 -1 элементов на массив
  • -R2018a: 2 48 -1 элементов на массив
  • -largeArrayDims: 2 48 -1 элементов на массив
  • -compatibleArrayDims 2 31 -1 элементов на массив

Наконец, если вы хотите обрабатывать более крупные объекты, я вижу решение записать ваши результаты в файлы (.txt или .csv, например) в c - часть вашего кода и прочитайте их обратно в части matlab целиком или по частям.

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

...