Matlab::data

Массив MATLAB

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

  • Его тип

  • Его размерности

  • Данные сопоставлены с этим массивом

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

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

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

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

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

Как функции MATLAB, стандартная программа шлюза файла MEX передает переменные MATLAB ссылкой. Однако эти аргументы являются указателями C. pointer к переменной является address (местоположение в памяти) переменной. Функции MATLAB обрабатывают хранение данных для вас автоматически. Когда передающие данные к файлу MEX, вы используете указатели, которые следуют определенным правилам для доступа и управления переменными. Для получения информации о работе с указателями обратитесь к ссылке программирования, такой как Язык программирования C Керниганом, B. W. и Д. М. Ричи.

Примечание

Поскольку переменные используют память, необходимо понять, как файл 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. Например, рассмотрите 3D массив, имеющий размерности 4-by-2-by-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

Комплекс с двойной точностью матрицы

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

MATLAB массивы 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))

Похожие темы