Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базовые средства матпакета Scilab

.pdf
Скачиваний:
63
Добавлен:
04.04.2023
Размер:
6.29 Mб
Скачать

Если связанные между собой данные имеют разные типы, то их можно сохранить путем объединения в массив ячеек, где ячейка содержит часть данных. Ссылка на элементы массива ячеек производится с использованием индексирования. При этом для индексирования массива ячеек используются круглые скобки (), а для индексирования содержимого ячеек, используются фигурные скобки {}.

Массивы ячеек удобны для структурирования разнородной информации. Для доступа к данным, хранящимся в структуре, необходимо знать названия полей структуры, тогда как для доступа к данным массива ячеек нужны только индексы, указывающие на конкретную ячейку. Самый простой вариант создания ячейки состоит в использовании фигурных скобок {}. Элементы одной строки массива отделяются друг от друга запятой, а столбцы точкой с запятой. Массивы ячеек в этом отношении аналогичны матрицам, но без ограничений на типы данных, находящихся внутри ячеек. В ячейке может находиться структура или массив ячеек. Для удобного просмотра содержимого массивов следует также использовать окно Редактор переменных. Кроме того, тип данных cell удобен для организации массивов данных, когда заранее не известен тип этих данных или известно, что данные разнородны.

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

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

Рассмотрим пример создания вектора ячеек для хранения разных типов данных (рис. 1.3.6-1).

--> // Создание векторов ячеек для хранения данных разных типов

--> book = struct('title', 'Онегин', 'author', 'Пушкин', 'year', 2000) book =

title: [1x1 string] author: [1x1 string] year: [1x1 constant] -->

--> Vcell(1) = {book}, Vcell(2) = {'Пушкин'}, Vcell(3) = {2000} Vcell =

[1x1 struct] Vcell = [1x1 struct]

81

[1x1 string] Vcell =

[1x1 struct ] [1x1 string ] [1x1 constant] -->

--> Vcell{1} ans =

title: [1x1 string] author: [1x1 string] year: [1x1 constant]

-->

 

-->

Vcell(1)

[1x1 struct] -->

--> VcellArray = cell(2, 2) VcellArray =

[0x0 constant] [0x0 constant] [0x0 constant] [0x0 constant]

Рис. 1.3.6-1 Создание векторов ячеек для хранения данных разных типов На рис. 1.3.6-1 задан вектор ячеек Vcell с тремя элементами. Первый

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

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

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

На рис. 1.3.6-2 показано, как извлечь несколько элементов из массива ячеек – список, разделенный запятыми, учитывая, что массив ячеек 4×6.

--> // Извлечение несколько элементов из массива ячеек

--> C = cell(4, 6); --> for k = 1:24

>C{k} = k * 2;

>end

--> C =

[2] [10] [18] [26] [34] [42] [4] [12] [20] [28] [36] [44]

82

[6] [14] [22] [30] [38] [46] [8] [16] [24] [32] [40] [48]

--> -->С{:, 5} ans =

34 ans = 36 ans =

38 ans = 40

-->// Это то же самое, что вводить С{1,5}, C{2,5}, С{3,5}, C{4,5}

Рис. 1.3.6-2 Извлечение несколько элементов из массива ячеек

Рассмотрим еще один пример (рис. 1.3.6-3), в котором показано, как считывать и записывать данные массива ячеек. Для этого создадим массив ячеек 2×3 текстовых и числовых данных.

--> // Считывание и запись данных в массив ячеек и из массива ячеек

-->

 

 

 

 

 

 

 

--> C = {'one', 'two',

'three'; 1, 2, 3}

 

C

=

 

 

 

 

 

 

 

 

[1x1

string

]

[1x1

string

]

[1x1 string

]

 

[1x1

constant]

[1x1

constant]

[1x1 constant]

-->

 

 

 

 

 

 

 

--> upLeft = C(1:2, 1:2)

 

 

 

upLeft

=

 

 

 

 

 

 

 

[1x1

string

]

[1x1

string

]

 

 

[1x1 constant]

 

[1x1 constant]

 

 

 

-->

 

 

 

 

 

 

 

--> //

Замена значений

элементам первой строки

 

-->C(1,1:3) = {'first','second','third'}

 

C

=

 

 

 

 

 

 

 

 

[1x1

string

]

[1x1

string

]

[1x1 string

]

 

[1x1

constant]

[1x1

constant]

[1x1 constant]

--> nicC = C(2,1:3)

 

 

 

 

nicC

=

 

 

 

 

 

 

 

[1x1

constant]

[1x1

constant]

[1x1 constant]

-->

 

 

 

 

 

 

 

--> //

Преобразование массива ячеек в вектор

 

-->nicV = cell2mat(nicC)

1.2. 3.

Рис. 1.3.6-3 Считывание и запись данных в массив ячеек и из массива ячеек

Существует два способа ссылки на элементы массива ячеек. Можно заключить индексы в круглые скобки () и обращаться к массиву ячеек,

83

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

Индексы массива ячеек в круглых скобках относятся к наборам ячеек. Например, круглые скобки используются, чтобы создать массив ячейки 2×2, который является подмножеством C.

Обновление набора ячеек выполняется их заменой с тем же числом ячеек. Например, чтобы заменить ячейки в первой строке C используется эквивалент массив ячеек размера (1×3). Чтобы заменить содержимое ячейки, аналогично можно индексировать и с использованием фигурных скобок

(рис. 1.3.6-4).

--> // Индексирование с использованием фигурных скобок

-->

--> last = C{2, 3} last =

3.

--> C{2, 3} = 300; --> C{2, 3}

ans = 300.

--> las = C{1:2, 1:2} las =

las(1)

first

las(2)

1.

las(3)

second

las(4)

2.

-->las(1) ans = first

Рис. 1.3.6-4 Индексирование с использованием фигурных скобок

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

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

Можно получить доступ к содержимому нескольких ячеек путем индексации с фигурными скобками.

84

1.3.7.Контрольные вопросы

1)Какие способы создания векторов и матриц реализованы в Scilab?

2)Каким образом создается вектор с постоянным шагом?

3)Можно ли создать матрицу, элементы строки которой изменяются с постоянным шагом?

4)С какого номера начинается индексация вектора?

5)Какая функция позволяет определить длину вектора?

6)Какие функции предназначены для определения числа строк, числа столбцов матрицы и общего количества ее элементов?

7)Что такое «пустая матрица» и как ее создать?

8)Какую матрицу создает операция ones?

9)Каким образом в Scilab могут быть объединены две матрицы?

10)С использованием каких функций матрицы могут динамически изменять свой размер в процессе выполнения программы?

11)Для чего предназначены в Scilabфункции matrix и resize_matrix?

12)Назначение и формат функции cat?

13)Каким образом удалить из матрицы определенный столбец?

14)Что такое векторизация?

15)Что такое стандартное индексирование векторов и матриц?

16)Что такое векторное индексирование матриц?

17)Что такое логическое индексирование матриц?

18)Что такое поэлементные действия (операции с точкой) и где они используются?

19)Каким образом можно транспонировать вектор или матрицу?

20)Требуется ли при работе с векторами и матрицами предварительное объявление их размера?

21)Какой символ используются для разделения элементов матрицы в строке, а какой для разделения ее столбцов?

22)Какие команды предназначены для заполнения матрицы случайными числами, распределенными по равномерному или нормальному закону распределения?

23)Какой командой можно осуществить выбор минимального и максимального значения элемента матрицы.

24)В каких случаях матрицы могут динамически изменять свой размер?

25)Как создается массив ячеек?

26)Что представляют собой операции доступа извлечения и модификации матриц?

27)Что такое индексирование и векторизация?

28)Что такое логическая индексация?

29)Когда можно использовать функцию find?

85

1.4. Средства визуализация в системе Scilab

Пользователь Scilab имеет целый ряд возможностей для визуализации данных:

высокоуровневые графические функции (plot, surf, mesh и многие другие);

интерактивную среду, компоненты которой позволяет изменять свойства элементов графика;

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

низкоуровневые средства построения графиков и простейших геометрических фигур;

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

Высокоуровневая графика позволяет пользователю получать результаты в графическом виде, прикладывая минимум усилий. Основную работу, связанную с построением графика, масштабированием осей, подбором цветов и т.д. берет на себя среда Scilab.

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

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

Впоследующих параграфах рассматриваются высокоуровневые и низкоуровневые графические средства, а также средства для создания графических интерфейсов пользователей (GUI).

86

o o o o

1.4.1. Высокоуровневые графические средства. Средства отображение графиков функций

и простейших геометрических фигур

Основные понятия высокоуровневой графики

Графическое изображение в высокоуровневые графики – это чаще всего графическое представление графика функций или графическое изображение простейших геометрических фигур.

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

Внешний вид графика определяют следующие факторы:

Вид математической функции в системе координат:

o одной переменной – графики функции с одной переменной в заданной системе координат:

в прямоугольной системе координат;

в полярной системе координат;

в комплексной плоскости (например, годографы);

в векторной плоскости;

oдвух переменных – графики функции с двумя переменными в заданной системе координат:

в пространственной прямоугольной системе координат;

в сферической системе координат;

в цилиндрической системе координат;

в векторном пространстве.

Способ представленияв виде:

oточечного графика;

o линейного графика (с учетом всевозможных представлений линии);

полигонального графика; градиентного графика; контурного графика; гистограммы.

87

Графические окна

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

Графические окнаимеют свою нумерацию. Чтобы создать новое графическое окно с конкретным номером достаточно выполнить функциюscf:

h = scf(id); h = scf(),

где: id необязательный целочисленный параметр, задающий номер окна,аh дескриптор создаваемого окна, который связан с набором свойств этого окна и их значениями.

Если параметр, указывающий номер создаваемого окна, отсутствует, то система присваивает окну последний незанятый порядковый номер, начиная с нуля. В ответ функция scf возвращает дескриптор окна, а также набор его свойств, причем большая часть значений свойств заранее предопределена (т.е. заданы по умолчанию), кроме того первое обращение к одной из графических команд автоматически вызывает появление графического окна, которому присваивается номер ноль (id=0) рис.1.4.1-1).

Рис. 1.4.1-1 Графическое окно с номером 0

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

88

Файл:Новое графическое окно, Загрузить…, Сохранить…, Экспортировать, Копировать в буфер, Параметры страницы, Печать, Закрыть;

Инструменты:Показать/скрыть панель инструментов, Увеличить область, Исходный вид, 2D/3Dвращение;

Правка: Установить текущим графическим окном, Очистить графическое окно…, Свойства графического окна…, Свойства осей, Разрешить выбор объектов, Включить/выключить управление подсказками данных, Начать/остановить изменение данных кривых;

Справка: Содержание, О Scilab.

Наиболее часто используемые команды вынесены на панель

инструментов в виде кнопок.

 

Переход

междуКомандным

окномиГрафическим

окномосуществляется

с помощью комбинации

клавиш<Alt+Tab>или с

помощью мыши.

Закрыть графическое окно можно традиционным способом – щелчком по крестику, расположенному в правом верхнем углу окна, или выполнением командыxdel(id), в скобках которой указывается id – номер закрываемого графического окна.

Перечень всех открытых графических окон можно посмотреть, выполнив командуwinsid, которая выводит в следующей строке номера открытых графических окон (рис.1.4.1-2).

-->//Примеры использования командscf, xdelиwinsid

-->scf(2); scf(3); scf(5);//Открытие графических окон 2,3,5

-->winsid//Вывод списка открытых графических окон ans =

2. 3. 5. -->

-->xdel(3);//Удаление графического окна с номером 3

-->winsid ans =

2. 5. -->scf();

Рис. 1.4.1-2 Примеры использования командscf, xdelиwinsid

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

89

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

Построение графиков функций от одной переменной

Начнем знакомство с графической системой Scilab построением графика функции одной переменной. Самым простым способом построения графика функцииy=f(x)являетсяформирование двух векторов одинаковой длины (вектора значений аргументовxи вектора соответствующих им значений функции у) с последующим выполнением функцииplot(x,y).Функцияplot(x,y)открывает графическое окно и отображает в нем график функцииy(x).

 

 

 

 

x

 

Рассмотрим, например, построение графика функции

y

 

e

2

на

 

 

 

 

 

отрезке[-1.5;1.5]. В результате выполнения функцииplot(x,y)появляется Графическое окно 0с графиком функции (рис.1.4.1-3).

-->// Построение графика функции

-->

-->x = -1.5 : 0.01 : 1.5; -->y = exp(-x.^2);

--> plot(x, y)

Рис. 1.4.1-3. Построение графика функции

 

 

 

x

y

 

e

2

 

Обратите внимание, что элемент меню графического окна File имеет команду Копировать в буфер обмена, которая позволяет копировать окно в буфер обмена, и, которое впоследствии можно вставить в Word или другой текстовый редактор.

90