MATLAB.Exponenta
–Û·Ë͇ Matlab&Toolboxes

MATLAB

В.Г.Потемкин "Введение в Matlab" (v 5.3)
Глава 7. Массивы ячеек

  В оглавление книги \ К следующему разделу \ К предыдущему разделу \ Предметный указатель

7.3. Организация данных

Массивы ячеек используются для объединения массивов данных разных типов и размеров. Массивы ячеек предпочтительнее массивов записей (структур) при следующих обстоятельствах:

  • когда требуется доступ одновременно к нескольким полям;
  • когда требуется доступ к подмножествам данных в виде списка переменных;
  • когда количество полей не определено;
  • когда вам требуется удаление полей из структуры.

Списки значений. Извлечение множественных данных из массивов записей и массивов ячеек осуществляется с помощью списков значений.

Список значений для массива записей - это объединение одноименных полей S.name = [S(1).name S(2).name … S(end).name].

Список значений для массива ячеек - это объединение ячеек C{:} = [C{1} C{2} … C{end}].

Конструкции вида S(m:n).name, C{m:n} также представляют собой списки значений.

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

Конструкция языка Массив записей Массив ячеек
Командная строка S.name C{:}
Список входных аргументов М-функции myfun(x, y, S.name) myfun(x, y, C{:})
Операция конкатенации [S.name] [C{:}]
Список выходных аргументов М-функции [S.name] = myfun [C{:}] = myfun
Составляющая массива ячеек {S.name} {C{:}}

Пример.
Рассмотрим некоторые примеры использования списков значений:
             формирование массива ячеек

                 C = {1 2 3 4}
                  C = [1]   [2]   [3]   [4]

             преобразование массива ячеек в числовой массив

                  A = [C{:}]
                  A = 1   2   3   4

             преобразование массива ячеек в трехмерный массив

                 B = cat(3, C{:})
                  B(:, :, 1) =   1
                  B(:, :, 2) =   2
                  B(:, :, 3) =   3
                  B(:, :, 4) =   4

             присвоение значений одному из полей массива записей

                 [S(1:3).FIELD] = deal(5)
                  S =
                  3x1 struct array with fields:
                           FIELD
                  S(:).FIELD
                  ans =   5
                  ans =   5
                  ans =   5

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

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

Пример.
Допустим, что имеются следующие данные:

  • массив размера 3х4, содержащий экспериментальные данные;
  • строка из 15 символов, содержащая имя экспериментатора;
  • массив размера 3х4х5, содержащий измерения последних 5 экспериментов.

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

  • Если данные организованы в виде структуры TEST, то для обращения к двум полям требуется два оператора присваивания:

                      newdata = TEST.measure
                      name = TEST.name

  • Если данные организованы в виде массива ячеек TEST, то для обращения к двум полям требуется всего один оператор установления соответствия deal:

                       [newdata, name] = deal(TEST{1:2})

формируем числовой массив A размера 3х3:

                     A = [0 1 2; 4 0 7; 3 1 2]
                      A =

0 1 2
4 0 7
3 1 2

Оценим 2-норму матрицы А, используя функцию normest и запишем результат в 2 отдельные ячейки массива B:

                    B = cell(1, 2);
                     [B{1:2}] = normest(A)

                     B =
                          [8.8826]    [4]

В первой ячейке B(1) содержится оценка нормы; во второй B(2) - количество итераций, потребовавшихся для вычислений.

Пример.
Сформируем массив ячеек А размера 1х3. Первая ячейка содержит матрицу размера 2х2; вторая - массив случайных чисел, распределенных по нормальному закону, размера 3х3, сформированный с помощью функции randn; третья - вектор-строку.

                      A{1, 1} = [1 2; 3 4];
                      A{1, 2} = randn(3, 3);
                      A{1, 3} = 1:5
                     
A =

[2x2 double] [3x3 double] [1x5 double] []
[] [] [] []
[] [] [] []

Теперь применим функцию суммирования к массиву A{1, 1}

                B = sum(A{1, 1})
                 B = 4   6

Чтобы применить функцию sum к содержимому ячеек, надо использовать цикл: 

                 for i = 1:length(A)
                     M{i} = sum(A{1, i});
                 end
                 M

                 M = [1x2 double] [1x3 double] [15] [0]
                 celldisp(M)
                 M{1} = 4   6
                 M{2} = -1.9728   0.3321   1.4788
                 M{3} = 15
                 M{4} = 0

  В оглавление книги \ К следующему разделу \ К предыдущему разделу \ Предметный указатель

 


Поиск по сайту:

Система Orphus

Яндекс.Метрика