MATLAB® язык работает с одним типом объекта: массивом MATLAB. Все переменный MATLAB (включая скаляры, векторы, матрицы, символьные массивы, массивы ячеек, структуры и объекты) хранятся как массивы MATLAB. В C/C + + массив MATLAB объявлен типомmxArray
. The mxArray
структура содержит следующую информацию об массиве:
Его тип
Его размерности
Данные, сопоставленные с этим массивом
Если число, является ли переменная вещественной или комплексной
Если он разрежен, то его индексы и ненулевые максимальные элементы
Если структура или объект, количество полей и имен полей
Для доступа к mxArray
structure, использовать функции в API на C или Фортран Матрица. Эти функции позволяют вам создавать, читать и запрашивать информацию о данных MATLAB в файлах MEX. Matrix API используют mwSize
и mwIndex
типы, чтобы избежать проблем переносимости и разрешить правильную компиляцию исходных файлов MEX во всех системах.
Как и функции MATLAB, стандартная программа шлюза файлов MEX передает переменный MATLAB по ссылке. Однако эти аргументы являются указателями на C. pointer к переменной является address (местоположение в памяти) переменной. Функции MATLAB обрабатывают автоматическое хранение данных. При передаче данных в файл MEX вы используете указатели, которые следуют определенным правилам доступа и манипулирования переменными. Для получения информации о работе с указателями обратитесь к ссылке по программированию, такому как The C Programming Language by Kernighan, B. W. и D. M. Ritchie.
Примечание
Поскольку переменные используют память, необходимо понять, как ваш файл MEX создает mxArray
и ваша ответственность за освобождение (освобождение) памяти. Это важно для предотвращения утечек памяти. Жизненный цикл mxArray
- и правила управления памятью - зависит от того, является ли это входным параметром, выходным аргументом или локальной переменной. Функция, которую вы вызываете, чтобы освободить mxArray
зависит от функции, которую вы использовали для ее создания. Для получения дополнительной информации проверьте функции для создания массивов в API на C Matrix.
prhs
Система координат mxArray
передан в файл MEX через prhs
входной параметр существует вне возможностей файла MEX. Не освобождайте память ни для каких mxArray
в prhs
параметр. Кроме того, prhs
переменные доступны только для чтения; не изменяйте их в своем Файле MEX.
plhs
Если вы создаете mxArray
(выделите память и создайте данные) для выходного аргумента, память и данные существуют за пределами возможностей файла MEX. Не освобождайте память на mxArray
возвращается в plhs
выходной параметр.
Вы выделяете память каждый раз, когда используете mxCreate*
функция для создания mxArray
или когда вы вызываете mxCalloc
и сопутствующие функции. После соблюдения правил обработки входа и выходных аргументов Файла MEX должен уничтожить временные массивы и освободить динамически выделенную память. Чтобы освободить память, используйте или mxDestroyArray
или mxFree
. Для получения информации о том, какую функцию использовать, см. MX Matrix Library.
MATLAB хранит данные в основной (столбцовой) схеме нумерации, которая заключается в том, как Фортран хранит матрицы. MATLAB использует это соглашение, поскольку оно изначально было написано на языке фортран. MATLAB сначала хранит элементы данных из первого столбца, затем элементы данных из второго столбца и так далее, через последний столбец.
Для примера, учитывая матрицу:
a = ['house'; 'floor'; 'porch']
a = house floor porch
его размерности:
size(a)
ans = 3 5
и его данные хранятся как:
Если матрица N-мерна, MATLAB представляет данные в N-основном порядке. Например, рассмотрим трехмерный массив, имеющий размерности 4
-by- 2
-by- 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
-by- n
, где m
количество строк и n
количество столбцов. Данные хранятся как вектор чередующихся чисел двойной точности, где действительная и мнимая части хранятся рядом друг с другом. Указатель на эти данные упоминается как pa
(указатель на массив). Чтобы протестировать некомплексную матрицу, вызовите mxIsComplex
.
До MATLAB Version 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
значение.
МассивыФайлы MATLAB char
массивы сохраняют данные как беззнаковые 16-битные целые числа. Преобразование char MATLAB
массив в строку C-стиля, вызов mxArrayToString
. Преобразование строки в стиле C в char
массив, вызов mxCreateString
.
Массивы ячеек являются набором массивов MATLAB, где каждый mxArray
упоминается как камера. Массивы ячеек позволяют хранить массивы MATLAB разных типов вместе. Массивы ячеек хранятся аналогично числовым матрицам, за исключением того, что фрагмент данных содержит один вектор указателей на mxArrays
. Представители этого вектора называются камерами. Каждая камера может быть любого поддерживаемого типа данных, даже другого массива ячеек.
A 1
-by- 1
структура хранится так же, как и 1
-by- 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. The jc
массив содержит информацию об индексе столбца. Если на j
1-й столбец разреженной матрицы имеет ненулевые элементы, jc[j]
- индекс в ir
и pa
первого ненулевого элемента в j
th столбца. Индексные jc[j+1] - 1
содержит последний ненулевой элемент в этом столбце. Для j
1й столбец разреженной матрицы, jc[j]
- общее количество ненулевых элементов во всех предыдущих столбцах. Последний элемент jc
массив, jc[n]
, равно nnz
, количество ненулевых элементов во всей разреженной матрице. Если nnz
меньше nzmax
в массив можно вставить больше ненулевых записей, не выделяя больше памяти.
Можно записать исходные файлы MEX, приложения MAT-файлов и приложения Engine в C/C + +, которые принимают любой класс или тип данных, поддерживаемый MATLAB (см. Типы данных). В Фортране только создание прецизионных n
-by- m
поддерживаются массивы и строки. Вы используете двоичные файлы C/C + + и Фортран MEX, такие как функции MATLAB.
Внимание
MATLAB не проверяет валидность структур данных MATLAB, созданных в C/C + + или Фортран с помощью одной из созданных функций Matrix Library (например mxCreateStructArray
). Использование недопустимого синтаксиса для создания структуры данных MATLAB может привести к неожиданному поведению в программе C/C + + или Фортран.
Для обработки массивов MATLAB используйте type mxArray
. Следующий оператор объявляет mxArray
именованные myData
:
mxArray *myData;
Определение значений myData
, используйте один из mxCreate*
функций. Некоторые полезные стандартные программы создания массивов: mxCreateNumericArray
, mxCreateCellArray
, и mxCreateCharArray
. Для примера следующий оператор назначает m
-by- 1
mxArray с плавающей точкой
инициализировано в 0
:
myData = mxCreateDoubleMatrix(m, 1, mxREAL);
Программисты C/C + + должны отметить, что данные в массиве MATLAB находятся в основном порядке. (Для рисунка см. раздел «Хранение данных».) Используйте MATLAB mxGet*
стандартные программы доступа к массивам для чтения данных из mxArray
.
The mxGet*
стандартные программы доступа к массивам получают ссылки на данные в mxArray
. Используйте эти стандартные программы для изменения данных в файле MEX. Каждая функция обеспечивает доступ к определенной информации в mxArray
. Некоторые полезные функции mxGetDoubles
, mxGetComplexDoubles
, mxGetM
, и mxGetString
. Многие из этих функций имеют соответствующие mxSet*
стандартные программы, позволяющие изменять значения в массиве.
Следующие операторы считывают входные prhs[0]
в строку C-стиля 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))