Язык MATLAB® работает с типом отдельного объекта: массив MATLAB. все переменные MATLAB (включая скаляры, векторы, матрицы, символьные массивы, массивы ячеек, структуры и объекты) сохранены как массивы MATLAB. На C/C++ массив MATLAB, как объявляют, имеет тип mxArray
. Структура mxArray
содержит следующую информацию о массиве:
Его тип
Его размерности
Данные сопоставлены с этим массивом
Если числовой, является ли переменная действительной или комплексной
Если разреженный, его индексы и ненулевые максимальные элементы
Если структура или объект, количество полей и имен полей
Чтобы получить доступ к структуре mxArray
, используйте API-функции в Матричной Библиотеке. Эти функции позволяют вам создавать, читать, и информация о запросе о данных MATLAB в ваших файлах MEX. Матричные Библиотечные функции используют тип mwSize
, чтобы избежать проблем мобильности и позволить исходным файлам MEX быть скомпилированными правильно во всех системах.
Как функции MATLAB, стандартная программа шлюза файла MEX передает переменные MATLAB ссылкой. Однако эти аргументы являются указателями C. Указатель на переменную является адресом (местоположение в памяти) переменной. Функции MATLAB обрабатывают хранение данных для вас автоматически. Когда передающие данные к файлу MEX, вы используете указатели, которые следуют определенным правилам для доступа и управления переменными. Для получения информации о работе с указателями обратитесь к ссылке программирования, такой как Язык программирования C Керниганом, B. W., и Д. M. Ричи.
Поскольку переменные используют память, необходимо понять, как файл MEX создает mxArray
и ответственность за выпуск (освобождения) памяти. Это важно, чтобы предотвратить утечки памяти. Жизненный цикл mxArray
— и правил для памяти управления — зависит от того, является ли это входным параметром, выходным аргументом или локальной переменной. Функция, которую вы вызываете, чтобы освободить mxArray
, зависит от функции, вы раньше создавали его. Для получения дополнительной информации ищите, функция в Создают или Удаляют Массив в Матричной Библиотеке C.
Входной параметр 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-major. Например, рассмотрите трехмерный массив, имеющий размерности 4
-by-2-by-
3
. Несмотря на то, что можно визуализировать данные как:
MATLAB внутренне представляет данные для этого трехмерного массива в следующем порядке:
A |
B |
C |
D |
E |
F |
G |
H |
I |
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 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-битные целые числа без знака. Чтобы преобразовать массив char
MATLAB в строку C-стиля, вызовите mxArrayToString
. Чтобы преобразовать строку C-стиля в массив char
, вызовите mxCreateString
.
Массивы ячеек являются набором массивов MATLAB, где каждый mxArray
упоминается как ячейка. Массивы ячеек позволяют массивам MATLAB различных типов быть сохраненными вместе. Массивы ячеек сохранены подобным образом к числовым матрицам, кроме данных, фрагмент содержит единственный вектор указателей на mxArrays
. Члены этого вектора называются ячейками. Каждая ячейка может иметь любой поддерживаемый тип данных, даже другой массив ячеек.
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. Массив jc
содержит информацию об индексе столбца. Если j
th столбец разреженной матрицы имеет какие-либо ненулевые элементы, jc[j]
является индексом в ir
и pa
первого ненулевого элемента в j
th столбец. Индекс jc[j+1] - 1
содержит последний ненулевой элемент в том столбце. Для j
th столбец разреженной матрицы, jc[j]
является общим количеством ненулевых элементов во всех предыдущих столбцах. Последний элемент массива jc
, jc[n]
, равен nnz
, количеству ненулевых элементов в целой разреженной матрице. Если nnz
является меньше, чем nzmax
, больше ненулевых записей может быть вставлено в массив, не выделяя больше устройства хранения данных.
Можно записать исходные файлы MEX, приложения MAT-файла и приложения механизма на C/C++, которые принимают любой класс или тип данных, поддержанный MATLAB (см. Типы данных). На Фортране только поддержано создание с двойной точностью n
-by-m
массивы и строки. Вы используете бинарные файлы MEX C/C++ и Фортрана как функции MATLAB.
MATLAB не проверяет, что законность структур данных MATLAB, созданных на C/C++ или Фортране с помощью одной из Матричной Библиотеки, создает функции (например, mxCreateStructArray
). Используя недопустимый синтаксис, чтобы создать структуру данных MATLAB может привести к неожиданному поведению в вашей программе C/C++ или Фортрана.
Чтобы обработать массивы MATLAB, используйте, вводят mxArray
. Следующий оператор объявляет mxArray
по имени myData
:
mxArray *myData;
Чтобы задать значения myData
, используйте одну из функций mxCreate*
. Некоторыми полезными стандартными программами создания массивов является mxCreateNumericArray
, mxCreateCellArray
и mxCreateCharArray
. Например, следующий оператор выделяет m
-by-1
mxArray
с плавающей точкой, инициализированный к 0
:
myData = mxCreateDoubleMatrix(m, 1, mxREAL);
Программисты C/C++ должны отметить, что данные в массиве MATLAB находятся в порядке развертывания по столбцам. (Для иллюстрации смотрите Хранение данных.) Используют стандартные программы доступа к массиву mxGet*
MATLAB, чтобы считать данные из mxArray
.
Стандартные программы доступа к массиву 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))