Команда mex
использует опцию -largeArrayDims
по умолчанию. Эта тема описывает, как обновить ваши файлы MEX, чтобы использовать 64-битный API.
Можно продолжить использовать 32-битный API путем вызова команды mex
с опцией -compatibleArrayDims
. Однако для получения дополнительной информации об использовании этой опции, смотрите Что, Если я Не Обновляю?.
Чтобы рассмотреть и обновить исходный код файла MEX, используйте следующий контрольный список.
Подготовьтесь ваш код прежде, чем отредактировать — видят, поддерживают Файлы и Создают Тесты.
Итеративно изменение и тестовый код.
Прежде, чем создать ваши файлы 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 работает с 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); |
При обновлении более старых файлов MEX вы могли найти вызовы неподдерживаемых функций, таких как mxCreateFull
, mxGetName
или mxIsString
. MATLAB® удалил поддержку этих функций в Версии 7.1 (R14SP3). Вы не можете использовать неподдерживаемые функции с 64-битными измерениями массива. Для списка неподдерживаемых функций и рекомендуемых замен, смотрите Устаревшие Функции, Более не не Зарегистрированные.
Обновите свой код, чтобы использовать эквивалентную функцию при наличии. Например, используйте mxCreateDoubleMatrix
вместо mxCreateFull
.
Чтобы создать 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 Гбайт памяти.
Для примера, который демонстрирует использование больших массивов, смотрите файл MEX arraySize.c
в Обработке Большого mxArrays.