Данные MATLAB

Массив MATLAB

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

  • Его тип

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

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

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

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

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

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

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

Как и функции MATLAB, стандартная программа шлюза файлов MEX передает переменный MATLAB по ссылке. Однако эти аргументы являются указателями на C. pointer к переменной является address (местоположение в памяти) переменной. Функции MATLAB обрабатывают автоматическое хранение данных. При передаче данных в файл MEX вы используете указатели, которые следуют определенным правилам доступа и манипулирования переменными. Для получения информации о работе с указателями обратитесь к ссылке по программированию, такому как The C Programming Language by Kernighan, B. W. и D. M. Ritchie.

Примечание

Поскольку переменные используют память, необходимо понять, как ваш файл MEX создает mxArray и ваша ответственность за освобождение (освобождение) памяти. Это важно для предотвращения утечек памяти. Жизненный цикл mxArray- и правила управления памятью - зависит от того, является ли это входным параметром, выходным аргументом или локальной переменной. Функция, которую вы вызываете, чтобы освободить mxArray зависит от функции, которую вы использовали для ее создания. Для получения дополнительной информации проверьте функции для создания массивов в API на C Matrix.

Входной параметр 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-основном порядке. Например, рассмотрим трехмерный массив, имеющий размерности 4-by- 2-by- 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-by- n, где m количество строк и n количество столбцов. Данные хранятся как вектор чередующихся чисел двойной точности, где действительная и мнимая части хранятся рядом друг с другом. Указатель на эти данные упоминается как pa (указатель на массив). Чтобы протестировать некомплексную матрицу, вызовите mxIsComplex.

До MATLAB Version 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-битные целые числа. Преобразование char MATLAB массив в строку C-стиля, вызов mxArrayToString. Преобразование строки в стиле C в char массив, вызов mxCreateString.

Массивы ячеек

Массивы ячеек являются набором массивов MATLAB, где каждый mxArray упоминается как камера. Массивы ячеек позволяют хранить массивы MATLAB разных типов вместе. Массивы ячеек хранятся аналогично числовым матрицам, за исключением того, что фрагмент данных содержит один вектор указателей на mxArrays. Представители этого вектора называются камерами. Каждая камера может быть любого поддерживаемого типа данных, даже другого массива ячеек.

Структуры

A 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. The jc массив содержит информацию об индексе столбца. Если на j1-й столбец разреженной матрицы имеет ненулевые элементы, jc[j] - индекс в ir и pa первого ненулевого элемента в jth столбца. Индексные jc[j+1] - 1 содержит последний ненулевой элемент в этом столбце. Для j1й столбец разреженной матрицы, jc[j] - общее количество ненулевых элементов во всех предыдущих столбцах. Последний элемент jc массив, jc[n], равно nnz, количество ненулевых элементов во всей разреженной матрице. Если nnz меньше nzmaxв массив можно вставить больше ненулевых записей, не выделяя больше памяти.

Использование типов данных

Можно записать исходные файлы MEX, приложения MAT-файлов и приложения Engine в C/C + +, которые принимают любой класс или тип данных, поддерживаемый MATLAB (см. Типы данных). В Фортране только создание прецизионных n-by- m поддерживаются массивы и строки. Вы используете двоичные файлы C/C + + и Фортран MEX, такие как функции MATLAB.

Внимание

MATLAB не проверяет валидность структур данных MATLAB, созданных в C/C + + или Фортран с помощью одной из созданных функций Matrix Library (например mxCreateStructArray). Использование недопустимого синтаксиса для создания структуры данных MATLAB может привести к неожиданному поведению в программе C/C + + или Фортран.

Объявление структур данных

Для обработки массивов MATLAB используйте type mxArray. Следующий оператор объявляет mxArray именованные myData:

mxArray *myData;

Определение значений myData, используйте один из mxCreate* функций. Некоторые полезные стандартные программы создания массивов: mxCreateNumericArray, mxCreateCellArray, и mxCreateCharArray. Для примера следующий оператор назначает m-by- 1 mxArray с плавающей точкой инициализировано в 0:

myData = mxCreateDoubleMatrix(m, 1, mxREAL);

Программисты C/C + + должны отметить, что данные в массиве MATLAB находятся в основном порядке. (Для рисунка см. раздел «Хранение данных».) Используйте MATLAB mxGet* стандартные программы доступа к массивам для чтения данных из mxArray.

Манипулирование данными

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

Похожие темы