Язык MATLAB ® работает с одним типом объекта - массивом MATLAB. Все переменные MATLAB (включая скаляры, векторы, матрицы, символьные массивы, массивы ячеек, структуры и объекты) сохраняются как массивы MATLAB. В C/C + + массив MATLAB объявляется типомmxArray. mxArray структура содержит следующую информацию о массиве:
Его тип
Его размеры
Данные, связанные с этим массивом
Если числовая, то является ли переменная действительной или комплексной
Если разрежен, его индексы и ненулевые максимальные элементы
Если структура или объект, количество полей и имен полей
Для доступа к mxArray используйте функции в API матрицы C или Fortran. Эти функции позволяют создавать, считывать и запрашивать информацию о данных MATLAB в файлах MEX. Матричные API используют mwSize и mwIndex во избежание проблем переносимости и обеспечения правильной компиляции исходных файлов MEX во всех системах.
Подобно функциям MATLAB, подпрограмма шлюза MEX-файлов передает переменные MATLAB по ссылке. Однако эти аргументы являются C-указателями. Указатель на переменную - это адрес (местоположение в памяти) переменной. Функции MATLAB обеспечивают автоматическое хранение данных. При передаче данных в MEX-файл используются указатели, которые следуют определенным правилам доступа к переменным и управления ими. Для получения информации о работе с указателями см. справочную информацию по программированию, такую как язык программирования C Kernighan, B. W. и D. M. Ritchie.
Примечание
Поскольку переменные используют память, необходимо понять, как MEX-файл создает mxArray и ваша ответственность за освобождение памяти. Это важно для предотвращения утечек памяти. Жизненный цикл mxArray- и правила управления памятью - зависит от того, является ли она входным аргументом, выходным аргументом или локальной переменной. Функция, вызываемая для отмены назначения mxArray зависит от функции, которую вы использовали для ее создания. Дополнительные сведения см. в функциях создания массивов в C Matrix API.
prhsОдин mxArray передано в MEX-файл через prhs входной параметр находится вне области MEX-файла. Не освобождайте память ни для одного mxArray в prhs параметр. Также, prhs переменные доступны только для чтения; не изменяйте их в файле MEX.
plhsПри создании mxArray (выделение памяти и создание данных) для выходного аргумента, память и данные находятся вне области MEX-файла. Не освобождайте память на mxArray возвращено в plhs выходной параметр.
Вы выделяете память при каждом использовании mxCreate* для создания функции mxArray или при вызове mxCalloc и связанные с этим функции. После соблюдения правил обработки входных и выходных аргументов MEX-файл должен уничтожить временные массивы и освободить динамически выделяемую память. Для освобождения памяти используйте либо mxDestroyArray или mxFree. Сведения об используемой функции см. в разделе Библиотека матриц MX.
MATLAB хранит данные в схеме нумерации «основной столбец» (по столбцам), т.е. в том, как Fortran хранит матрицы. MATLAB использует это соглашение, потому что первоначально оно было написано в Фортране. MATLAB внутренне сохраняет элементы данных из первого столбца, затем элементы данных из второго столбца и т.д. через последний столбец.
Например, учитывая матрицу:
a = ['house'; 'floor'; 'porch']
a = house floor porch
его размеры:
size(a)
ans =
3 5и его данные хранятся в виде:
![]()
Если матрица является N-мерной, MATLAB представляет данные в N-мажорном порядке. Например, рассмотрим трехмерный массив, имеющий размеры 4около-2около-3. Хотя можно визуализировать данные следующим образом:

MATLAB внутренне представляет данные для этого трехмерного массива в следующем порядке:
A | B | C | D | E | F | G | H | Я | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
mxCalcSingleSubscript функция создает смещение от первого элемента массива к требуемому элементу, используя N-мерный подстрочный индекс.
Наиболее распространенным типом данных в MATLAB является сложная матрица с двойной точностью, без синтаксического анализа. Эти матрицы имеют тип double и имеют размеры mоколо-n, где m - количество строк и n - количество столбцов. Данные хранятся в виде вектора перемежающихся чисел с двойной точностью, где действительная и мнимая части хранятся рядом друг с другом. Указатель на эти данные называется pa (указатель на массив). Для проверки несложной матрицы вызовите mxIsComplex.
До MATLAB версии 9.4 (R2018a) MATLAB использовал отдельное представление хранения. Данные хранятся в виде двух векторов чисел двойной точности - один содержит вещественные данные, а другой - мнимые данные. Указатели на эти данные называются pr (указатель на реальные данные) и pi (указатель на мнимые данные), соответственно. Некомплексная матрица - это матрица, pi является NULL. Однако для проверки несложной матрицы вызовите mxIsComplex.
MATLAB поддерживает целые числа с плавающей запятой одинарной точности и 8-, 16-, 32- и 64-разрядные целые числа, как со знаком, так и без знака.
Логический тип данных представляет логический true или false состояние с использованием чисел 1 и 0соответственно. Некоторые функции и операторы MATLAB возвращают логические 1 или логическое 0 чтобы указать, было ли обнаружено, что определенное условие является истинным или нет. Например, оператор (5 * 10) > 40 возвращает логическое 1 значение.
char МножестваMATLAB char массивы хранят данные как неподписанные 16-битные целые числа. Преобразование MATLAB char массив в строку стиля C, вызов mxArrayToString. Преобразование строки в стиле C в char массив, вызов mxCreateString.
Массивы ячеек представляют собой совокупность массивов MATLAB, в которых каждый mxArray называется ячейкой. Массивы ячеек позволяют совместно хранить массивы MATLAB различных типов. Массивы ячеек хранятся аналогично числовым матрицам, за исключением того, что часть данных содержит единственный вектор указателей на mxArrays. Члены этого вектора называются клетками. Каждая ячейка может быть любого поддерживаемого типа данных, даже другого массива ячеек.
A 1около-1 структура хранится таким же образом, как и 1около-n массив ячеек, где n - количество полей в структуре. Элементы вектора данных называются полями. Каждое поле связано с именем, сохраненным в mxArray.
Объекты сохраняются и к ним обращаются так же, как и к структурам. В MATLAB объекты именуются структурами с помощью зарегистрированных методов. Вне MATLAB объект представляет собой структуру, содержащую хранилище для дополнительного имени класса, которое идентифицирует имя объекта.
Массивы MATLAB любого типа могут быть многомерными. Вектор целых чисел хранится там, где каждый элемент является размером соответствующего измерения. Способ хранения данных тот же, что и для матриц.
Массивы MATLAB любого типа могут быть пустыми. Пустое mxArray представляет собой единицу, по меньшей мере, с одним размером, равным нулю. Например, двойная точность mxArray типа double, где m и n равно 0 и pa является NULL, является пустым массивом.
Разреженные матрицы имеют иное соглашение хранения, чем полные матрицы в MATLAB. Параметр pa по-прежнему является массивом чисел с двойной точностью или логических значений, но этот массив содержит только ненулевые элементы данных.
Существует три дополнительных параметра: nzmax, ir, и jc. Используйте mwSize и mwIndex при объявлении переменных для этих параметров.
nzmax - целое число, содержащее длину ir и pa. Это максимальное число ненулевых элементов в разреженной матрице.
ir указывает на целочисленный массив длины nzmax содержащие индексы строк соответствующих элементов в pa.
jc указывает на целочисленный массив длины n+1, где n - количество столбцов в разреженной матрице. В C первый элемент mxArray имеет индекс 0. jc содержит информацию об индексе столбца. Если jВ-м столбце разреженной матрицы имеются ненулевые элементы, jc[j] является индексом в ir и pa первого ненулевого элемента в j4-я колонна. Индекс jc[j+1] - 1 содержит последний ненулевой элемент в этом столбце. Для jтретий столбец разреженной матрицы, jc[j] - общее число ненулевых элементов во всех предыдущих столбцах. Последний элемент jc массив, jc[n], равно nnz, число ненулевых элементов во всей разреженной матрице. Если nnz меньше, чем nzmax, в массив может быть вставлено больше ненулевых записей без выделения дополнительных ресурсов хранения.
В C/C + + можно записывать исходные MEX-файлы, приложения MAT-файлов и приложения ядра, которые принимают любой класс или тип данных, поддерживаемые MATLAB (см. Типы данных). В Фортране только создание двойной точностиnоколо-m поддерживаются массивы и строки. Вы используете двоичные файлы C/C + + и Fortran MEX, такие как функции MATLAB.
Внимание
MATLAB не проверяет достоверность структур данных MATLAB, созданных в C/C + + или Fortran с помощью одной из функций создания библиотеки матриц (например ,mxCreateStructArray). Использование недопустимого синтаксиса для создания структуры данных MATLAB может привести к непредвиденному поведению в программе C/C + + или Fortran.
Для обработки массивов MATLAB используйте тип mxArray. Следующая инструкция объявляет mxArray названный myData:
mxArray *myData;
Определение значений myData, используйте один из mxCreate* функции. Некоторые полезные процедуры создания массивов: mxCreateNumericArray, mxCreateCellArray, и mxCreateCharArray. Например, следующий оператор назначает mоколо-1 плавающая точка mxArray инициализировано в 0:
myData = mxCreateDoubleMatrix(m, 1, mxREAL);
Программисты C/C + + должны отметить, что данные в массиве MATLAB находятся в основном порядке столбцов. (Иллюстрацию см. в разделе Хранение данных.) Использование MATLABmxGet* процедуры доступа к массиву для чтения данных из mxArray.
mxGet* подпрограммы доступа к массиву получают ссылки на данные в mxArray. Эти процедуры используются для изменения данных в файле MEX. Каждая функция обеспечивает доступ к определенной информации в mxArray. Некоторые полезные функции mxGetDoubles, mxGetComplexDoubles, mxGetM, и mxGetString. Многие из этих функций имеют соответствующие mxSet* для изменения значений в массиве.
Следующие операторы считывают входные данные prhs[0] в строку в стиле Си buf.
char *buf; int buflen; int status; buflen = mxGetN(prhs[0])*sizeof(mxChar)+1; buf = mxMalloc(buflen); status = mxGetString(prhs[0], buf, buflen);
explore ПримерСуществует пример исходного MEX-файла, включенного в MATLAB, называемого explore.c, который идентифицирует тип данных входной переменной. Исходный код для этого примера находится в matlabroot/extern/examples/mex, где matlabroot представляет папку верхнего уровня, в которой в системе установлена программа MATLAB.
Примечание
В независимых от платформы обсуждениях, относящихся к путям к папкам, в этой документации используется соглашение UNIX ®. Например, общая ссылка наmex папка - matlabroot/extern/examples/mex.
Чтобы создать пример файла MEX, сначала скопируйте файл в папку с возможностью записи по пути.
copyfile(fullfile(matlabroot,'extern','examples','mex','explore.c'),'.','f')
Используйте mex для создания файла MEX.
mex explore.c -R2018a
Тип:
x = 2; explore(x)
------------------------------------------------ Name: prhs[0] Dimensions: 1x1 Class Name: double ------------------------------------------------ (1,1) = 2
explore принимает любой тип данных. Попробуйте использовать explore с этими примерами:
explore([1 2 3 4 5]) explore 1 2 3 4 5 explore({1 2 3 4 5}) explore(int8([1 2 3 4 5])) explore {1 2 3 4 5} explore(sparse(eye(5))) explore(struct('name', 'Joe Jones', 'ext', 7332)) explore(1, 2, 3, 4, 5) explore(complex(3,4))