Самоучитель по Matlab

         

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


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

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]



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


С помощью функции 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 =

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



Присваивание с помощью функции 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 = 

Привет!



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



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


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

наиболее сложный тип данных в системе 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.



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


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

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

» C=cellstr(S) 

С =

'Привет.'

'дорогой'

'ДРУГ'

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

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



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


Ввиду обилия типов данных в системе MATLAB часто возникает необходимость в их тестировании [

Помимо функций iscell и iscellstr вы всегда можете использовать для тестирования массивов ячеек функцию 15а(имя объекта, 'cell') и команду whos имя объекта. — Примеч. ред.

]. Для тестирования массивов ячеек может использоваться функция is сеll (С), которая возвращает логическое значение 1, если С — массив ячеек, и 0 в противном случае. Это поясняют следующие примеры:

» t=iscell(A) 

t

=

1

» B=[l 23]; 

» iscell(B)

 ans=

0



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


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



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


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

вложенных

массивов ячеек — пожалуй, самого сложного типа данных.

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

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

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