exponenta event banner

Данные MATLAB

Массив MATLAB

Язык MATLAB ® работает с одним типом объекта - массивом MATLAB. Все переменные MATLAB (включая скаляры, векторы, матрицы, символьные массивы, массивы ячеек, структуры и объекты) сохраняются как массивы MATLAB. В C/C + + массив MATLAB объявляется типомmxArray. mxArray структура содержит следующую информацию о массиве:

  • Его тип

  • Его размеры

  • Данные, связанные с этим массивом

  • Если числовая, то является ли переменная действительной или комплексной

  • Если разрежен, его индексы и ненулевые максимальные элементы

  • Если структура или объект, количество полей и имен полей

Для доступа к mxArray используйте функции в API матрицы C или Fortran. Эти функции позволяют создавать, считывать и запрашивать информацию о данных MATLAB в файлах MEX. Матричные API используют mwSize и mwIndex во избежание проблем переносимости и обеспечения правильной компиляции исходных файлов MEX во всех системах.

Жизненный цикл mxArray

Подобно функциям 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

Сложные матрицы двойной точности

Наиболее распространенным типом данных в 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 значение.

MATLAB 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))

Связанные темы