Урок №15.

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

Создание массивов ячеек

Массив ячеек — наиболее сложный тип данных в системе MATLAB. Это массив, элементами которого являются ячейки, содержащие любые типы массивов, включая массивы ячеек. Отличительным атрибутом массивов ячеек является задание содержимого последних в фигурных скобках {}. Создавать массивы ячеек можно с помощью оператора присваивания.

Существуют два способа присваивания данных отдельным ячейкам:

Рассмотрим первый способ. Для этого создадим файл-сценарий с именем се.m:

А( !.!)={'Курить вредно!'}; 

А(1.2)={[1 2;3 4]}; 

A(2,l)={2+3i}; 

А(2.2)={0:0.1:1}

Уже отмечалось, что в командном режиме малая русская буква «с» в строках ведет к пе-реводу строки ввода. Однако в m-файлах, создаваемых в редакторе/отладчике М-фай-лов, эта недоработка обычно не проявляется. Хотя гарантии в этом, увы, пока нет.

В этом примере задан массив ячеек с четырьмя элементами: строкой символов, матрицей, комплексным числом и одномерным массивом из 11 чисел. Теперь можно вызвать этот массив:

» се

А =

'Курить вредно!' [2x2 double] 

[2.0000+ 3.00001] [1x11 double]

» A(l.l) 

ans =

'Курить вредно!'

»А(2.1) 

ans =

[2.0000+ 3.00001]

Заметим, что к ячейкам такого массива можно обращаться с помощью индексирования, например в виде А(1,1), А(2,1) и т. д.

При индексации содержимого массив ячеек задается следующим образом:

А{1,1}='Курить вредно!'; 

А{1.2}-[1 2:3 4]; 

А{2,1}=2+31; 

А{2,2}=0:0.1:1;

Теперь можно ознакомиться с созданным массивом ячеек в командном режиме:

» А

ans =

'Курить вредно! ' [2x2 double]

[2.0000+ 3.0000i] [1x11double] 

» А{1,1} 

ans =

Курить вредно! 

» А{2.1}

 ans =

2.0000 + 3.0000i

При серьезной работе с массивами структур (записей) и массивами ячеек полезно иметь дополнительную информацию о списках значений. Для получения такой информации следует выполнить команду help list.

Создание ячеек с помощью функции cell

Для создания массива ячеек может использоваться функция eell :

Следующие примеры поясняют применение данной функции:

» cell(2) 

ans =

[] []

[] []

» C=cell(2.3) 

С =

[] [] []

[] [] []

» C0=zeros(2.3)

С0=

0 0 0

0 0 0

» celHsize(CO))

ans =

[] [] []

[] [] []

Образовавшиеся пустые ячейки можно заполнить, используя операции присваивания:

» С{1.1}=1;С{1.2}='Привет':С{2,1}='Неllо':С{2.2}=[1 2; 3 4];

»С 

С =

[ 1]        'Привет'      []

'Hello [2x2 double]     []

Визуализация массивов ячеек

Для отображения массива ячеек С служит функция celldlsp(C). Она дает рекурсивное отображение содержимого массива ячеек С. Например, для ранее созданного массива ячеек А получится следующее:

» celldisp(A)

А{1.1}=

Курить вредно!

А{2.1}=

 2.0000 + 3.0000i

А{1.2} =

1 2

3 4

А{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:

» S={'Привет.'; 'дорогой'; 'друг'}; 

» C=cellstr(S) 

С =

'Привет.'

'дорогой'

'ДРУГ'

Это еще один способ формирования массивов ячеек.

Функция iscellstr(C) равна 1, если ее аргумент С — строковый массив ячеек, и 0, если это неверно.

Присваивание с помощью функции deal

С помощью функции deal возможно множественное присваивание входных данных выходным:

Возможен ряд полезных применений функции deal:

Следующий пример иллюстрирует применение функции deal:

» [X,Y.Z]=deal(1.2+31,'Привет!') 

X =

Y =

2.0000.+ 3.0000i 

Z =

Привет!

» [X Y Z]=dealС Привет!') 

X =

Привет!

 Y =

Привет! 

Z = 

Привет!

Тестирование имен массивов ячеек

Ввиду обилия типов данных в системе MATLAB часто возникает необходимость в их тестировании [Помимо функций iscell и iscellstr вы всегда можете использовать для тестирования массивов ячеек функцию 15а(имя объекта, 'cell') и команду whos имя объекта. — Примеч. ред.]. Для тестирования массивов ячеек может использоваться функция is сеll (С), которая возвращает логическое значение 1, если С — массив ячеек, и 0 в противном случае. Это поясняют следующие примеры:

» t=iscell(A) 

t =

1

» B=[l 23]; 

» iscell(B)

 ans=

0

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

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

Примеры применения данных функций:

» А=[1 2; 3 4: 5 6] 

А=

1 2

3 4

5 6

»С= num2cell(A.2) 

С=

[1x2 double]

[1x2 double]

[1x2 double] 

»С{1.1} 

ans =

1 2 

»С{2.1} 

ans =

3 4 

»С{3,1} 

ans =

5 б 

» cat(2.C{:}) 

ans =

1 2 3 4 5 6

ans =

1 2

3 4

5 6

» num2cell(A.[l 2]) 

ans =

[3x2 double]

Пример преобразования:

» С={' Привет! '.123. 2+31}

 С =

'Привет!' [123] [2.0000+3.00001] 

» f={ 'name' . 'number' , 'complex'}; 

» S=cell2struct(C,f.2) 

S = 

name: 'Привет! '

number: 1 2 3

complex: 2.0000+ 3.0000i

» C=struct2cellS)

С =

'Привет!'

[           123]

[2.0000+3.00001]

Многомерные массивы ячеек

С помощью функции cat можно формировать многомерные массивы ячеек. Например, трехмерный массив С формируется следующим образом (m-файл с именем се2.m):

А{1.1}='Курить вредно!'; 

А{1,2}=[1 2:3 4];

 А{2.1}=2+31;

А{2.2}=0:0.1:1;

 В{1,1}='Пить тоже вредно!';

 В{1,2}=[1 2 3 4]; 

В{2.1}=2; 

B{2.2}=2*pi; 

C=cat(3.A.B);

Теперь можно просмотреть данный массив, имеющий две страницы:

» се2

» С 

С(:,:,1) =

'Курить вредно!' [2x2 double]

[2.0000+ 3.00001] [1x11 double]

С(:.:.2) =

'Пить тоже вредно!' [1x4 double] 

[ 2]                [    6.2832]

Доступ к ячейкам многомерных массивов очевиден и поясняется следующими примерами:

» C(l.l.l) 

ans =

'Курить вредно!' 

» C(1.1.2)

ans =

'Пить тоже вредно!'

Вложенные массивы ячеек

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

В следующем примере показано формирование массива ячеек А с вложенным в него массивом В (он был создан в примере выше):

» clear A;

» A(l.l)={{magic(3).{'Hello!'}}};

»А(1.2)={В};

» А

ans =

{1x2 cell} {2x2 cell}

ans =

[3x3 double] {1x1 cell} >> A{2}

 ans =

'Пить тоже вредно!' [1x4 double]

[ 2               ] [    6.2832] 

» cellplot(A)

В данном случае вложенный массив отображается полностью как часть массива А.

Что нового мы узнали?

В этом уроке мы научились: