Где field1 – название первого поля структуры; VALUES1 – переменная первого поля структуры, и т.д

Приведем пример, в котором использование структуры позволяет эффективно представить данные. Таким примером будет инвентарный перечень книг, в котором для каждой книги необходимо указывать ее наименование, автора и год издания. Причем количество книг может быть разным, но будем полгать, что не более 100. Для хранения информации об одной книге будем использовать структуру, которая задается в MatLab с помощью ключевого слова struct следующим образом:

S = struct('title','','author','','year',0);

В итоге задается структура с тремя полями: title, author и year. Каждое поле имеет свой тип данных и значение.

Для того, чтобы записать в эту структуру конкретные значения используется оператор ‘.’ (точка) для доступа к тому или иному полю структуры:

S.title = 'Евгений Онегин';
S.author = 'Пушкин';
S.year = 2000;

и таким образом, переменная S хранит информацию о выбранной книге.

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

lib(100,1) = struct('title','','author','','year',0);

и записывать информацию о книгах так:

lib(1).title = 'Евгений Онегин';
lib(1).author = 'Пушкин';
lib(1).year = 2000;

Данный пример показывает удобство хранения информации по книгам. Графически массив структур можно представить в виде таблицы, в которой роль столбцов играют поля, а роль строк элементы массива структур (рис. 1.1).

При работе со структурами полезными являются следующие функции:

isstruct( S ) – возвращает истину, если аргумент структура
isfield( S, 'name') – возвращает истину, если имеется такое поле
fieldnames( S ) – возвращает массив строк с именами всех полей

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

  название автор год издания
lib[1] lib[1].title lib[1].author lib[1].year
       
lib[2] lib[2].title lib[2].author lib[2].year
       
lib[3] lib[3].title lib[3].author lib[3].year
Где field1 – название первого поля структуры; VALUES1 – переменная первого поля структуры, и т.д - student2.ru      
lib[100] lib[100].title lib[100].author lib[100].year

Рис. 1.1. Графическое представление массива структур хранения информации по 100 книгам

Ячейки в MatLab

Ячейки также как и структуры могут содержать разные типы данных, объединенные одной переменной, но в отличии от вектора структур, вектор ячеек может менять тип данных в каждом элементе. Таким образом, вектор ячеек является универсальным контейнером – его элементы могут содержать любые типы и структуры данных, с которыми работает MatLab – векторы чисел любой размерности, строки, векторы структур и другие (вложенные) векторы ячеек.

Методы создания вектора ячеек похожи на методы создания вектора структур. Как и в случае структур, векторы ячеек могут быть созданы либо путём последовательного присваивания значений отдельным элементам массива, либо созданы целиком при помощи специальной функции cell(). Однако в любом случае важно различать ячейку (элемент вектора ячеек) и её содержимое. Ячейка – это содержимое плюс некоторая оболочка (служебная структура данных) вокруг этого содержимого, позволяющая хранить в ячейке произвольные типы данных любого размера.

Приведем пример создания вектора ячеек хранения разных типов данных.

book = struct('title','Онегин','author','Пушкин','year',2000);
MyCell(1)={book};
MyCell(2)={'Пушкин'};
MyCell(3)={2000};

Здесь задан вектор ячеек MyCell с тремя элементами. Первый элемент соответствует структуре, второй – строке, а третий – числу. В этом и заключается особенность организации данных с помощью ячеек: у каждого элемента свой тип данных.

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

MyCell{1}

Выведет на экран

title: 'Евгений Онегин'
author: 'Пушкин'
year: 2000

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

MyCell(1)

выведет

[1x1 struct]

Для того чтобы задать вектор или матрицу ячеек с пустыми (неопределенными) значениями, используется функция cell() как показано ниже.

MyCellArray = cell(2, 2);

задается матрица размером 2х2. Данную инициализацию целесообразно выполнять когда нужно определить большой вектор или матрицу ячеек и в цикле задавать их значения. В этом случае MatLab сразу создает массивы нужных размеров, в результате чего повышается скорость выполнения программ.

В заключении рассмотрим возможность программирования функции с произвольным числом аргументов благодаря использованию ячеек. Для этого в качестве аргумента функции указывается ключевое слово varargin, которое интерпретируется внутри функции как вектор ячеек с переданными аргументами:

function len = SumSquare( varargin )
n= length( varargin );
len = 0;
for k = 1 : n
len = len + varargin{ k }(1)^2 +varargin{ k }(2)^2;
end

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

SumSquare( [ 1 2], [3 4] ) % ответ 30
SumSquare( [ 1 2], [3 4], [ 5 6] ) % ответ 91

Таким образом, благодаря использованию ячеек функции SumSquare() можно передавать произвольное число двумерных векторов.

Наши рекомендации