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