Progress-servis55.ru

Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Массив ячеек в 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]=deal (A.FIELD);

[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 в противном случае. Это поясняют следующие примеры:

Читать еще:  For в matlab

Функции преобразования типов данных

При обработке сложных данных возникает необходимость в преобразовании их типов. Ниже представлены такие функции, имеющие отношение к массивам ячеек:

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 на русском

Выражение любого типа данных системы 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 не единственный в списке параметров, то он должен стоять последним. В рассмотренном примере с помощью фигурных скобок мы извлекаем содержимое отдельной ячейки, то есть вектор, а с помощью дальнейшей индексации круглыми скобками извлекаем первую и вторую координаты вектора.

Читать еще:  Метод простой итерации matlab

При вызове функции 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

12345
678910
1011121314
1516171819
2021222324
cell 1,2

[ 2 — 4i 5 ]

528
73
673

Обратите внимание на использование фигурных скобок для последнего уровня вложенности. Это обусловлено тем, что необходимо обратиться к содержанию ячейки внутри массива ячеек.

И наконец, можно сформировать вложенные массивы ячеек простым присваиванием значений его элементам, как это сделано выше на шаге 3.

Индексирование вложенных ячеек. Для того чтобы проиндексировать вложенные ячейки, необходимо использовать объединение индексов. Первое множество индексов определяет доступ к верхнему уровню ячеек, а последующие индексные выражения, заключенные в фигурные скобки, задают доступ к низшим уровням.

Пример.

Приведенный выше массив ячеек A имеет 3 уровня вложенности:

  • для доступа к числовому массиву размера 5х5 в ячейке (1, 1) надо использовать обращение — A<1, 1>;
  • для доступа к числовому массиву размера 3х3 в позиции (1, 1) ячейки (1, 2) надо использовать обращение — A<1, 2><1, 1>;
  • для доступа к элементу (2, 2) предыдущего числового массива надо использовать обращение — A<1, 2><1, 1>(2, 2);
  • для доступа к массиву ячеек размера 2х2 в ячейке (1, 2) надо использовать обращение — A<1, 2>;
  • для доступа к пустой ячейке в позиции (1, 2) ячейки (2, 2), вложенной в ячейку А(1, 2), надо использовать обращение — A<1,2><2,2><1,2>.

Исправляем ошибки: Нашли опечатку? Выделите ее мышкой и нажмите Ctrl+Enter

Ссылка на основную публикацию
Adblock
detector