Язык MATLAB® работает с типом отдельного объекта: массив MATLAB. Все переменные MATLAB (включая скаляры, векторы, матрицы, символьные массивы, массивы ячеек, структуры и объекты) хранятся как массивы MATLAB. На C/C++ массив MATLAB, как объявляют, имеет тип mxArray
. mxArray
структура содержит следующую информацию о массиве:
Его тип
Его размерности
Данные сопоставлены с этим массивом
Если числовой, является ли переменная действительной или комплексной
Если разреженный, его индексы и ненулевые максимальные элементы
Если структура или объект, количество полей и имен полей
Получить доступ к mxArray
структура, используйте функции в Матричных API C или Фортрана. Эти функции позволяют вам создавать, читать, и информация о запросе о данных MATLAB в ваших файлах MEX. Матричные API используют mwSize
и mwIndex
типы, чтобы избежать проблем мобильности и позволить исходным файлам MEX, которые будут скомпилированы правильно во всех системах.
Как функции MATLAB, стандартная программа шлюза файла MEX передает переменные MATLAB ссылкой. Однако эти аргументы являются указателями C. pointer к переменной является address (местоположение в памяти) переменной. Функции MATLAB обрабатывают хранение данных для вас автоматически. Когда передающие данные к файлу MEX, вы используете указатели, которые следуют определенным правилам для доступа и управления переменными. Для получения информации о работе с указателями обратитесь к ссылке программирования, такой как Язык программирования C Керниганом, B. W. и Д. М. Ричи.
Примечание
Поскольку переменные используют память, необходимо изучить, как файл MEX создает mxArray
и ваша ответственность за выпуск (освобождения) памяти. Это важно, чтобы предотвратить утечки памяти. Жизненный цикл mxArray
— и правила для памяти управления — зависят от того, является ли это входным параметром, выходным аргументом или локальной переменной. Функция вы вызываете, чтобы освободить mxArray
зависит от функции, вы раньше создавали ее. Для получения дополнительной информации ищите функции, чтобы создать массивы в Матричном API 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. Например, рассмотрите 3D массив, имеющий размерности 4
- 2
- 3
. Несмотря на то, что можно визуализировать данные как:
MATLAB внутренне представляет данные для этого 3D массива в следующем порядке:
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
- n
, где m
количество строк и n
количество столбцов. Данные хранятся как вектор из чередованных, чисел с двойной точностью, где действительные и мнимые части хранятся друг рядом с другом. Указатель на эти данные упоминается как pa
(указатель на массив). Чтобы протестировать на некомплексную матрицу, вызвать mxIsComplex
.
Перед MATLAB Version 9.4 (R2018a) MATLAB использовал представление отдельной системы хранения. Данные хранятся как два вектора из чисел с двойной точностью — каждый содержит действительные данные, и каждый содержит мнимые данные. Указатели на эти данные упоминаются как pr
(указатель на действительные данные) и pi
(указатель на мнимые данные), соответственно. Некомплексная матрица является той чей pi
isNull
. Однако, чтобы протестировать на некомплексную матрицу, вызвать 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
- 1
структура хранится таким же образом как 1
- n
массив ячеек, где n
количество полей в структуре. Члены вектора данных называются полями. Каждое поле сопоставлено с именем, сохраненным в mxArray
.
Объекты хранятся и получили доступ к тому же пути как структуры. В MATLAB объекты называют структурами с зарегистрированными методами. Вне MATLAB объект является структурой, которая содержит устройство хранения данных для дополнительного имени класса, которое идентифицирует имя объекта.
Массивы MATLAB любого типа могут быть многомерными. Вектор из целых чисел хранится, где каждым элементом является размер соответствующей размерности. Метод устройства хранения данных данных эквивалентен для матриц.
Массивы MATLAB любого типа могут быть пустыми. Пустой mxArray
один по крайней мере с одной равной нулю размерностью. Например, mxArray
с двойной точностью из типа
double
, где m
и n
равняйтесь 0 и pa
isNull
, пустой массив.
Разреженные матрицы имеют различное соглашение устройства хранения данных из полных матриц в 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
с двойной точностью-
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
- 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))