mex
команда использует -largeArrayDims
опция по умолчанию. Эта тема описывает, как обновить ваши файлы MEX, чтобы использовать 64-битный API.
Можно продолжить использовать 32-битный API путем вызова mex
команда с -compatibleArrayDims
опция. Однако для получения дополнительной информации об использовании этой опции, смотрите Что, Если я Не Обновляю?.
Чтобы рассмотреть и обновить исходный код файла MEX, используйте следующий контрольный список.
Подготовьтесь ваш код прежде, чем отредактировать — видят, поддерживают Файлы и Создают Тесты.
Итеративно изменение и тестовый код.
Прежде, чем создать ваши файлы MEX с 64-битным API, осуществите рефакторинг свой существующий код с помощью Переменных Обновления и, для Фортрана, Обновление Файлы MEX на языке ФОРТРАН, чтобы использовать 64-битный API.
После каждого изменения создайте и протестируйте свой код:
Создайте с 32-битным API. Например, чтобы создать myMexFile.c
Ввод:
mex -compatibleArrayDims myMexFile.c
Протестируйте после каждого рефакторинга — видят Тест, Отладку, и Устраняют разногласия После Каждой Итерации Рефакторинга.
Компиляция с помощью 64-битного API. Создавать myMexFile.c
Ввод:
mex myMexFile.c
Разрешите отказы, и предупреждения — видят Твердость Отказы Сборки-largeArrayDims и Предупреждения.
Сравните Результаты — видят, Выполняют 64-битный файл MEX и Сравнивают Результаты с 32-битной Версией.
Проверяйте, что память — видит Эксперимент с Большими массивами.
Следующие процедуры используют терминологию C/C++ и пример кода. Выпуски акций файлов MEX Фортрана, с большим количеством задач, описанных в Обновлении Файлы MEX на языке ФОРТРАН, чтобы использовать 64-битный API.
Прежде, чем изменить ваш код, проверьте, что файл MEX работает с 32-битным API. Как минимум создайте список из ожидаемых вводов и выводов или создайте полный тестовый набор. Используйте эти тесты, чтобы сравнить результаты с обновленным исходным кодом. Результаты должны быть идентичными.
Поддержите весь источник, двоичный файл и тестовые файлы.
Чтобы обработать большие массивы, преобразуйте переменные, содержащие индексы массива или размеры, чтобы использовать mwSize
и mwIndex
типы вместо 32-битного int
ввод. Рассмотрите свой код, чтобы видеть, содержит ли он следующие типы переменных:
Переменные, используемые непосредственно Матричными API-функциями — видят Аргументы Обновления, Используемые к Вызову функций в 64-битном API.
Промежуточные переменные — видят Переменные Обновления, Используемые для Индексов массива и Размеров.
Переменные, используемые и в качестве значений размера/индекса и в качестве 32-битных целых чисел — видят, Анализируют Другие Переменные.
Идентифицируйте 64-битные API-функции в своем коде, которые используют mwSize
/ mwIndex
типы. Для списка функций смотрите Используя 64-битный API. Ищите переменные, которые вы используете, чтобы вызвать функции. Проверяйте функциональную подпись, показанную под Синтаксисом, направляющимся на документации ссылки на функцию. Подпись идентифицирует, что переменные тот берут mwSize
/ mwIndex
значения как значения ввода или вывода. Замените свои переменные, чтобы использовать правильный тип.
Например, предположите, что ваш код использует mxCreateDoubleMatrix
функция, как показано в следующих операторах:
int nrows,ncolumns; ... y_out = mxCreateDoubleMatrix(nrows, ncolumns, mxREAL);
Чтобы видеть функциональную подпись, введите:
doc mxCreateDoubleMatrix
Подпись:
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag)
Тип для входных параметров m
и n
mwSize
. Измените свой код как показано в таблице.
Замена: | С: |
---|---|
int nrows,ncolumns; |
mwSize nrows,ncolumns; |
Если ваше использование кода промежуточные переменные, чтобы вычислить значения размера и индекса, используйте mwSize
/ mwIndex
для этих переменных. Например, следующий код объявляет входные параметры к mxCreateDoubleMatrix
как вводят mwSize
:
mwSize nrows,ncolumns; /* inputs to mxCreateDoubleMatrix */ int numDataPoints; nrows = 3; numDataPoints = nrows * 2; ncolumns = numDataPoints + 1; ... y_out = mxCreateDoubleMatrix(nrows, ncolumns, mxREAL);
Этот пример использует промежуточную переменную, numDataPoints (типа int
), чтобы вычислить значение ncolumns. Если вы копируете 64-битное значение с nrows в 32-битную переменную, numDataPoints, получившееся значение обрезает. Ваш файл MEX мог разрушить или привести к неправильным результатам. Используйте вводят mwSize
для numDataPoints, как показано в следующей таблице.
Замена: | С: |
---|---|
int numDataPoints; |
mwSize numDataPoints; |
Вы не должны заменять каждую целочисленную переменную в своем коде. Например, полевые числа в структурах и кодах статусов имеют тип int
. Однако необходимо идентифицировать переменные, используемые для нескольких целей и, при необходимости, заменить их на несколько переменных.
Следующий пример создает матрицу, myNumeric, и структуру, myStruct, на основе количества датчиков. Код использует одну переменную, numSensors, и для размера массива и для количества полей в структуре.
mxArray *myNumeric, *myStruct; int numSensors; mwSize m, n; char **fieldnames; ... myNumeric = mxCreateDoubleMatrix(numSensors, n, mxREAL); myStruct = mxCreateStructMatrix(m, n, numSensors, fieldnames);
Функциональные подписи для mxCreateDoubleMatrix
и mxCreateStructMatrix
:
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag) mxArray *mxCreateStructMatrix(mwSize m, mwSize n, int nfields, const char **fieldnames);
Для mxCreateDoubleMatrix
функция, ваш код использует numSensors для переменной m. Типом для m является mwSize
. Для mxCreateStructMatrix
функция, ваш код использует numSensors для переменной nfields. Типом для nfields является int
. Чтобы обработать обе функции, замените numSensors на две новых переменные, как показано в следующей таблице.
Замена: | С: |
---|---|
int numSensors; |
/* create 2 variables */ /* of different types */ mwSize numSensorSize; int numSensorFields; |
myNumeric = mxCreateDoubleMatrix( numSensors, n, mxREAL); |
/* use mwSize variable */ /* numSensorSize */ myNumeric = mxCreateDoubleMatrix( numSensorSize, n, mxREAL); |
myStruct = mxCreateStructMatrix( m, n, numSensors, fieldnames); |
/* use int variable */ /* numSensorFields */ myStruct = mxCreateStructMatrix( m, n, numSensorFields, fieldnames); |
Создавать myMexFile.c
с 32-битным API введите:
mex -compatibleArrayDims myMexFile.c
Используйте тесты, которые вы создали в начале этого процесса, чтобы сравнить результаты вашего обновленного файла MEX с вашим исходным двоичным файлом. Оба файла MEX должны возвратить идентичные результаты. В противном случае отладьте и разрешите любые различия. Различия легче разрешить теперь чем тогда, когда вы создаете использование 64-битного API.
-largeArrayDims
Создайте отказы и предупрежденияПосле рассмотрения и обновления вашего кода, скомпилируйте свой файл MEX с помощью API обработки большого массива. Создавать myMexFile.c
с 64-битным API введите:
mex myMexFile.c
Начиная с mwSize
/ mwIndex
типы являются типами MATLAB®, ваш компилятор иногда называет их size_t
, unsigned_int64
, или другими аналогичными именами.
Большинство проблем сборки связано с несоответствиями типов между 32-битными и 64-битными типами. Обратитесь к Шагу 5 в том, Как я обновляю файлы MEX, чтобы использовать API обработки большого массива (-largeArrayDims)? идентифицировать общие проблемы сборки для определенных компиляторов и возможные решения.
Сравните результаты выполнения вашего файла MEX, скомпилированного с 64-битным API с результатами вашего исходного двоичного файла. Если существуют какие-либо различия или отказы, используйте отладчик, чтобы исследовать причину. Для получения информации о возможностях вашего отладчика обратитесь к своей документации компилятора.
Чтобы идентифицировать проблемы — и возможные решения — вы можете столкнуться при выполнении файлов MEX, относиться к Шагу 6 в том, Как я обновляю файлы MEX, чтобы использовать API обработки большого массива (-largeArrayDims)?.
После того, как вы решите вопросы и обновите ваш файл MEX, он реплицирует функциональность вашего оригинального кода при использовании API обработки большого массива.
Если у вас есть доступ к машине с большими объемами памяти, можно экспериментировать с большими массивами. Массив чисел с плавающей запятой с двойной точностью (значение по умолчанию в MATLAB) с 232 элементами берет приблизительно 32 Гбайт памяти.
Для примера, который демонстрирует использование больших массивов, смотрите arraySize.c
Файл MEX в Обработке Большого mxArrays в Файлах MEX на C.