Matlab::data

Массив MATLAB

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

  • Его тип

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

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

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

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

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

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

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

Как функции 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

и его данные хранятся как:

Data layout is h f p o l o u o r s o c e r h.

Если матрица является N-мерной, MATLAB представляет данные в порядке N-major. Например, рассмотрите 3D массив, имеющий размерности 4- 2- 3. Несмотря на то, что можно визуализировать данные как:

Letters of alphabet arranged on three data pages A-H, I-P, and Q-X.

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- 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 значение.

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

Похожие темы