Массив ячеек в matlab
Массив ячеек в matlab
Создание массивов ячеек
Создание ячеек с помощью функции cell
Визуализация массивов ячеек
Создание строкового массива ячеек из массива символов
Присваивание с помощью функции deal
Функция тестирования имен массивов ячеек
Функции преобразования типов данных
Многомерные и вложенные массивы ячеек
Создание массивов ячеек
Массив ячеек — наиболее сложный тип данных в системе MATLAB. Это массив, элементами которого являются ячейки, содержащие любые типы массивов, включая массивы ячеек. Отличительным атрибутом массивов ячеек является задание содержимого последних в фигурных скобках <>. Создавать массивы ячеек можно с помощью оператора присваивания.
Существуют два способа присваивания данных отдельным ячейкам:
Рассмотрим первый способ. Для этого создадим файл-сценарий с именем се.m:
Уже отмечалось, что в командном режиме малая русская буква «с» в строках ведет к пе-реводу строки ввода. Однако в m-файлах, создаваемых в редакторе/отладчике М-фай-лов, эта недоработка обычно не проявляется. Хотя гарантии в этом, увы, пока нет.
В этом примере задан массив ячеек с четырьмя элементами: строкой символов, матрицей, комплексным числом и одномерным массивом из 11 чисел. Теперь можно вызвать этот массив:
‘Курить вредно!’ [2×2 double]
[2.0000+ 3.00001] [1×11 double]
Заметим, что к ячейкам такого массива можно обращаться с помощью индексирования, например в виде А(1,1), А(2,1) и т. д.
При индексации содержимого массив ячеек задается следующим образом:
Теперь можно ознакомиться с созданным массивом ячеек в командном режиме:
‘Курить вредно! ‘ [2×2 double]
[2.0000+ 3.0000i] [1x11double]
При серьезной работе с массивами структур (записей) и массивами ячеек полезно иметь дополнительную информацию о списках значений. Для получения такой информации следует выполнить команду help list.
Создание ячеек с помощью функции cell
Для создания массива ячеек может использоваться функция eell :
cell(N) — создает массив ячеек из NxN пустых матриц;
cell(M.N) или cell([M,N]) — создает массив ячеек из MxN пустых матриц;
cell(M.N.P. ) или сеll([М N Р . ]) — создает массив из MxNxPx. пустых матриц;
cell (size(A)) — создает массив ячеек из пустых матриц того же размера, что имассив А;
cell (объект Java) — автоматически преобразует объекты или массивы Java (javaarray) в массив ячеек, элементы которого являются объектами MATLAB.
Следующие примеры поясняют применение данной функции:
Образовавшиеся пустые ячейки можно заполнить, используя операции присваивания:
‘Hello ‘ [2×2 double] []
Визуализация массивов ячеек
Для отображения массива ячеек С служит функция celldlsp(C). Она дает рекурсивное отображение содержимого массива ячеек С. Например, для ранее созданного массива ячеек А получится следующее:
А <2.2>-Columns 1 through 7
0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000
Columns 8 through 11
0.7000 0.8000 0.9000 1.0000
Для более наглядного графического представления массива ячеек может использоваться команда cell plot:
Создание строкового массива ячеек из массива символов
Для создания из массива символов S строкового массива ячеек может использоваться функция eellstr(S). Каждый ряд массива символов превращается в отдельную ячейку. Следующий пример поясняет применение функции cellstr:
Это еще один способ формирования массивов ячеек.
Функция iscellstr(C) равна 1, если ее аргумент С — строковый массив ячеек, и 0, если это неверно.
Присваивание с помощью функции deal
С помощью функции deal возможно множественное присваивание входных данных выходным:
[A.B,C. ]=deal(X,Y,Z. ) — обеспечивает последовательное присваивание входных данных выходным, то есть А=Х, B=Y, C=Z и т. д.;
[A,B,C. ]=deal(X) — присваивает единственный вход всем выходам, т. е. А=Х, В=Х, С=Х и т. д.
Возможен ряд полезных применений функции deal:
[S.FIELD]=deal (X) — присваивает всем полям FIELD структуры S значения X. Если S не существует, то нужно использовать конструкцию [S(1:M)*.FIELD]= deal(X);
[X<:>]=dea1 (A. FIELD) — копирует поля FIELD структуры А в массив ячеек X. Если X не существует, следует использовать конструкцию [X
[A,B,C. ]=deal (X<:>) — копирует содержимое массива ячеек X в отдельные переменные А, В, С. ;
[A,B,C. ]=deal(S.FIELD) — копирует содержимое поля FIELD массива структур S в отдельные переменные А, В, С. ;
Следующий пример иллюстрирует применение функции deal:
» [X Y Z]=dealС Привет!’)
Тестирование имен массивов ячеек
Ввиду обилия типов данных в системе MATLAB часто возникает необходимость в их тестировании [Помимо функций iscell и iscellstr вы всегда можете использовать для тестирования массивов ячеек функцию 15а(имя объекта, ‘cell’) и команду whos имя объекта. — Примеч. ред.]. Для тестирования массивов ячеек может использоваться функция is сеll (С), которая возвращает логическое значение 1, если С — массив ячеек, и 0 в противном случае. Это поясняют следующие примеры:
Функции преобразования типов данных
При обработке сложных данных возникает необходимость в преобразовании их типов. Ниже представлены такие функции, имеющие отношение к массивам ячеек:
num2cell (A,DIM) — преобразует массив чисел А в массив ячеек, помещая в одну и ту же ячейку элементы, соответствующие одному значению индекса вдоль измерения, указанного параметром DIM. Например, num2cell (A.2) преобразует каждый ряд массива А в отдельную ячейку. cat(DIM.C<:>) осуществляет обратное преобразование.
num2cell (A) — преобразует массив чисел А в массив ячеек и возвращает последний. Каждый элемент А превращается в отдельную ячейку. Возвращаемый массив имеет тот же размер и ту же размерность, что и исходный массив А.
Массив ячеек в matlab
Ячейки также как и структуры могут содержать разные типы данных, объединенные одной переменной, но в отличии от вектора структур, вектор ячеек может менять тип данных в каждом элементе. Таким образом, вектор ячеек является универсальным контейнером – его элементы могут содержать любые типы и структуры данных, с которыми работает MatLab – векторы чисел любой размерности, строки, векторы структур и другие (вложенные) векторы ячеек.
Методы создания вектора ячеек похожи на методы создания вектора структур. Как и в случае структур, векторы ячеек могут быть созданы либо путём последовательного присваивания значений отдельным элементам массива, либо созданы целиком при помощи специальной функции cell(). Однако в любом случае важно различать ячейку (элемент вектора ячеек) и её содержимое. Ячейка – это содержимое плюс некоторая оболочка (служебная структура данных) вокруг этого содержимого, позволяющая хранить в ячейке произвольные типы данных любого размера.
Приведем пример создания вектора ячеек хранения разных типов данных.
Здесь задан вектор ячеек MyCell с тремя элементами. Первый элемент соответствует структуре, второй – строке, а третий – числу. В этом и заключается особенность организации данных с помощью ячеек: у каждого элемента свой тип данных.
Для обращения к содержимому той или иной ячейки используются фигурные скобки, внутри которых ставится индекс элемента с которым предполагается работа:
выведет на экран
title: ‘Евгений Онегин’
author: ‘Пушкин’
year: 2000
Если же используются круглые скобки, то будет возвращена структура данных вместо отдельных значений, например
Для того чтобы задать вектор или матрицу ячеек с пустыми (неопределенными) значениями, используется функция cell() как показано ниже.
MyCellArray = cell(2, 2);
задается матрица размером 2х2. Данную инициализацию целесообразно выполнять когда нужно определить большой вектор или матрицу ячеек и в цикле задавать их значения. В этом случае MatLab сразу создает массивы нужных размеров, в результате чего повышается скорость выполнения программ.
В заключении рассмотрим возможность программирования функции с произвольным числом аргументов благодаря использованию ячеек. Для этого в качестве аргумента функции указывается ключевое слово varargin, которое интерпретируется внутри функции как вектор ячеек с переданными аргументами:
function len = SumSquare( varargin )
n= length( varargin );
len = 0;
for k = 1 : n
len = len + varargin< k >(1)^2 +varargin< k >(2)^2;
end
Данная функция вычисляет сумму квадратов чисел, которые передаются ей следующим образом:
SumSquare( [ 1 2], [3 4] ) % ответ 30
SumSquare( [ 1 2], [3 4], [ 5 6] ) % ответ 91
Таким образом, благодаря использованию ячеек функции SumSquare() можно передавать произвольное число двумерных векторов.
© 2020 Научная библиотека
Копирование информации со страницы разрешается только с указанием ссылки на данный сайт
Массив ячеек в matlab
9. Массивы ячеек.
Массив ячеек может содержать в качестве элементов массивы разных типов! Таким образом, он является универсальным контейнером — его ячейки могут содержать любые типы и структуры данных, с которыми работает MATLAB — массивы чисел любой размерности, строки, массивы структур и другие ( вложенные ) массивы ячеек. Массив ячеек может быть полем структуры.
Методы создания массивов ячеек похожи на методы создания структур. Как и в случае структур, массивы ячеек могут быть созданы либо путём последовательного присваивания значений отдельным элементам массива, либо созданы целиком при помощи специальной функции cell(). Однако в любом случае важно различать ячейку ( элемент массива ячеек ) и её содержимое. Ячейка — это содержимое плюс некоторая оболочка (служебная структура данных) вокруг этого содержимого, позволяющая хранить в ячейке произвольные типы данных любого размера.
Выражение любого типа данных системы MATLAB можно превратить в ячейку, заключив его в фигурные скобки. Тогда с помощью следующих присваиваний и обычных операций индексации
MyStruct = struct( ‘field1′,[ 1 2 3],’field2′,’Hello’);
MyCellArray( 1, 1 ) = < 'Bonjour!' >;
MyCellArray( 1, 2 ) = < [ 1 2 3; 4 5 6; 7 8 9 ] >;
MyCellArray( 2, 1 ) = < MyStruct >;
MyCellArray( 2, 2 ) = < [ 9 7 5 ] >;
строится массив ячеек 2×2, элементами которого являются ячейки, содержащие соответственно текстовую строку, числовой массив 3×3, структуру MyStruct и вектор-строку 1×3. Итак, построенный массив ячеек содержит разнородные данные, о чём нам и сообщает система MATLAB при вводе имени такого массива и нажатии клавиши Enter:
При этом показывается содержимое не всех ячеек этого массива. Более подробную информацию можно получить, вызвав функцию celldisp(MyCellArray):
MyCellArray <1,1>=
Bonjour!
MyCellArray <2,1>=
field1 : [ 1 2 3 ]
field2 : ‘Hello’
MyCellArray <1,2>=
1 2 3
4 5 6
7 8 9
MyCellArray <2,2>=
9 7 5
Отсюда видно, что для того, чтобы подобраться к содержимому ячеек, нужно индексировать массив ячеек при помощи фигурных скобок. При обычной индексации круглыми скобками мы из массива ячеек извлекаем отдельную ячейку. Напоминаем ещё раз о том, что следует чётко различать саму ячейку и её содержимое ( см. выше ).
Массивы ячеек полностью решают типовую задачу хранения нескольких строковых данных под одним именем. Раньше мы уже формировали матрицы типа char, каждая строка которых имела одну и ту же длину. Это очевидным образом ограничивает применение такого решения. В случае массива ячеек такого ограничения нет:
cellNames < 1 >= ‘function1’;
cellNames < 2 >= ‘func2’;
Здесь мы продемонстрировали применение фигурных скобок в роли индексирующих элементов, так что использовать фигурные скобки в правых частях операции присваивания теперь не нужно ( там присутствуют значения, а не ячейки ). В итоге под именем массива cellNames хранятся две текстовые строки ( можно и больше ), доступ к каждой из которых осуществляется по индексу в соответствии с синтаксисом массива ячеек. Вот код, который выводит на экран обе текстовые строки:
disp( cellNames < 1 >); disp( cellNames < 2 >);
Как и в случае структур, показанное выше поэлементное создание массива ячеек неэффективно с точки зрения производительности. Это не создаёт проблем в медленном интерактивном режиме работы, но в программном режиме этот процесс лучше предварить вызовом функции cell():
MyCellArray = cell( 2, 2 );
которая сразу создаст массив ячеек требуемой размерности и размера, причём каждая ячейка будет пустой. Пустые ячейки обозначаются как <[]>. Затем можно осуществлять ранее рассмотренные поэлементные присваивания, так как теперь они не требуют перестройки структуры массива с каждым новым присваиванием.
Содержимым пустой ячейки является пустой числовой массив, который, как мы знаем, обозначается []. Чтобы удалить некоторый диапазон ячеек из массива ячеек, нужно этому диапазону присвоить значение пустого массива []:
MyCellArray( 2, : ) = [];
Теперь массив ячеек MyCellArray имеет размер 1×2, так как мы только что удалили всю вторую строку массива.
У массивов ячеек имеется множество полезных применений. Например, с помощью массива ячеек решается задача организации M-функции, которой можно передать произвольно большое число аргументов. Допустим, требуется вычислить суммарную длину заранее неизвестного числа вектор-строк. Эта задача решается с помощью ключевых слов varargin и varargout ( второе ключевое слово используется, когда M-функция возвращает заранее неизвестное число выходных значений ).
В определении M-функции параметр, через который передаётся заранее неизвестное число входных аргументов, нужно обозначить ключевым словом varargin. Им обозначается массив ячеек, в который упакованы эти параметры. Функция всегда может узнать истинное число аргументов в этом параметре, вычислив функцию length. Ниже представлен код функции, вычисляющей сумму квадратов длин вектор-строк:
function sumlen = NumLength( varargin )
n= length( varargin );
sumlen = 0;
for k = 1 : n sumlen = sumlen + varargin< k >(1)^2 +varargin< k >(2)^2;
end
Если аргумент varargin не единственный в списке параметров, то он должен стоять последним. В рассмотренном примере с помощью фигурных скобок мы извлекаем содержимое отдельной ячейки, то есть вектор, а с помощью дальнейшей индексации круглыми скобками извлекаем первую и вторую координаты вектора.
При вызове функции NumLength не нужно ( и нельзя ) упаковывать входные числовые вектор-строки в массив ячеек, так как MATLAB делает это сам. Достаточно перечислить их в качестве фактических параметров через запятую:
NumLength( [ 1 2], [3 4] )
ans =
30
Теперь вызовем функцию NumLength с другим числом параметров:
NumLength( [ 1 2], [3 4], [ 5 6] )
ans =
91
Функция легко обрабатывает оба этих случая.
Использование массивов ячеек для передачи M-функциям произвольного числа параметров (или для возвращения функцией произвольного числа выходных значений) является единственно возвожным решением проблемы. Существуют ещё и другие случаи, когда обязательно требуется применение массива ячеек. О них будет рассказано в следующей главе. А сейчас ещё упомянем удобный способ заменить список величин, разделённых запятыми, компактным индексным выражением с массивом ячеек.
Таким заменителем является индексное выражение, извлекающее содержимое диапазона ячеек из массива ячеек. Для примера рассмотрим функцию plot(), которая изучалась нами в главе, посвящённой построению графиков функций. Этой функции в качестве параметров передаются массив значений независимой переменной, массив значений зависимой переменной и текстовая строка, управляющая внешним видом графика. Для компактности все эти переменные ( массивы ) можно упаковать в массив ячеек, например,
F( 1 ) = < 0 : 0.1 : pi >;
F( 2 ) = < sin( F<1>) >;
F( 3 ) = < 'bo:' >;
Теперь вся информация, необходимая для построения графика функции сосредоточена в единственной переменной F. Построение графика функции можно осуществить с помощью компактного выражения
plot( F < 1 : 3 >)
так как операция взятия содержимого диапазона ячеек с точки зрения системы MATLAB порождает список величин, разделённых запятыми.
Массив ячеек в matlab
Сформировать вложенные массивы ячеек можно с помощью последовательности фигурных скобок, функции cell или операторов присваивания. Для уже сформированных массивов можно получить доступ и манипулировать отдельными ячейками, подмассивами ячеек или элементами самих ячеек.
Применение фигурных скобок. Для создания вложенных массивов ячеек можно применять фигурные скобки.
Пример.
Заметим, что в правой части последнего оператора присваивания использовано 3 пары фигурных скобок: первая пара определяет ячейку A(1, 2) массива A, вторая задает внутренний массив ячеек размера 2х2, который, в свою очередь, содержит ячейку <17 [ ]>.
Применение функции cell. Для формирования вложенного массива ячеек с помощью функции cell выполним следующие операции:
1. Создадим пустой массив ячеек размера 1х2:
A = cell(1, 2);
2. Создадим пустой массив ячеек A(1, 2) размера 2х2 внутри массива A:
A(1, 2) =
3. Заполним массив A, включая вложенный массив, с помощью операторов присваивания:
A(1, 1) =
A<1, 2>(1, 1) = <[5 2 8; 7 3 0; 6 7 3]>;
A<1, 2>(1, 2) = <'Test 1'>;
A<1, 2>(2, 1) = <[2-4i 5+7i]>;
A<1, 2>(2, 2) =
A<1, 2><2, 2>(1) = <17>;
cell 1,1
| cell 1,2
|