Урок 15. Массивы ячеек

1. Урок 15. Массивы ячеек

 

Урок №15.

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

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

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

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

  • Создание строкового массива ячеек из массива символов

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

  • Функция тестирования имен массивов ячеек

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

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

 

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

 

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

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

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

  • индексацией ячеек;

  • индексацией содержимого.

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

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

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

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

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

Примечание

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

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

» се

А =

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

[2.0000+ 3.00001] [1x11 double]

» A(1,1) 

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.

 

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

 

Создание ячеек с помощью функции 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.

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

» 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]     []

 

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

 

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

Для отображения массива ячеек С служит функция 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:

 

5. Создание строкового массива ячеек из массива символов

 

Создание строкового массива ячеек из массива символов

Для создания из массива символов S строкового массива ячеек может использоваться функция eellstr(S). Каждый ряд массива символов превращается в отдельную ячейку. Следующий пример поясняет применение функции cellstr:

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

» C=cellstr(S) 

С =

'Привет.'

'дорогой'

'ДРУГ'

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

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

 

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

 

Присваивание с помощью функции 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{1:M}]=deal (A.FIELD);

  • [A,B,C,...]=deal (X{:}) — копирует содержимое массива ячеек X в отдельные переменные А, В, С,...;

  • [A,B,C,...]=deal(S.FIELD) — копирует содержимое поля FIELD массива структур S в отдельные переменные А, В, С,...;

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

» [X,Y.Z]=deal(1,2+3i,'Привет!') 

X =

Y =

2.0000.+ 3.0000i 

Z =

Привет!

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

X =

Привет!

 Y =

Привет! 

Z = 

Привет!

 

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

 

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

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

» t=iscell(A) 

t =

1

» B=[l 23]; 

» iscell(B)

 ans=

0

 

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

 

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

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

  • num2cell (A,DIM) — преобразует массив чисел А в массив ячеек, помещая в одну и ту же ячейку элементы, соответствующие одному значению индекса вдоль измерения, указанного параметром DIM. Например, num2cell (A.2) преобразует каждый ряд массива А в отдельную ячейку. cat(DIM.C{:}) осуществляет обратное преобразование.

  • num2cell (A) — преобразует массив чисел А в массив ячеек и возвращает последний. Каждый элемент А превращается в отдельную ячейку. Возвращаемый массив имеет тот же размер и ту же размерность, что и исходный массив А.

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

» А=[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]

  • cell2struct(C. FIELDS. DIM) — преобразует массив ячеек С в массив структур, превращая размерность DIM массива ячеек С в поля структуры S. Размерность 1 — столбцы. Размерность 2 — строки. FILEDS — массив символов или строковый массив ячеек.

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

» С={' Привет! '.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

  • struct2cell (S) — преобразует массив структур S размером тхп, в котором содержатся р полей, в массив ячеек, так что возвращаемый массив будет иметь размер рхтхп. Если массив структур многомерный, то возвращаемый массив ячеек будет иметь размер, равный [р size(S)]. Схему структуры с названиями полей возвращаемый массив ячеек не содержит. Пример такого преобразования приводится ниже:

» C=struct2cellS)

С =

'Привет!'

[           123]

[2.0000+3.0000i]

 

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

 

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

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

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

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

 А{2.1}=2+3i;

А{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.0000i] [1x11 double]

С(:.:.2) =

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

[ 2]                [    6.2832]

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

» C(l.l.l) 

ans =

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

» C(1.1.2)

ans =

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

 

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

 

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

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

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

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

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

 

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

 

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

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

  • Создавать ячейки и массивы ячеек. 

  • Осуществлять визуализацию массивов ячеек. 

  • Создавать массивы символьных ячеек из массивов строк. 

  • Осуществлять присваивание ячейкам значений. 

  • Использовать функцию тестирования имен массивов ячеек. 

  • Применять функции преобразования типов. 

  • Создавать многомерные и вложенные массивы ячеек.