Учебник Математические пакеты
.pdf4.
--> f2() // Обращение к функции f2
--> a a =
4.
Рис.1.2.6-7 Пример, иллюстрирующий область видимости переменных
Обратите внимание, что при обращении к функции f1, переменная а изменила свое значение, а при обращении к функции f2 значение а осталось прежним. Дело в том, что и в командной строке, и в функции f1, переменная, а объявлена глобальной, то есть она является видимой для f1. В функции f2 переменная а является локальной, то есть невидимой для функции f2, таким образом, это две разные переменные, расположенные в разных областях оперативной памяти.
ВScilab имеется еще ряд функций для работы с глобальными переменными, имеющими тот же формат, что и функция global:
clearglobal – уничтожает глобальные переменные списка; isglobal – проверяет, является ли переменная глобальной; gstacksize – определяет размер области глобальных переменных.
Влюбом языке программирования использование глобальных перемен-
ных усложняют понимание программ, кроме того они менее защищены от изменений. Поэтому если есть возможность, данные в функции лучше передавать через параметры.
1.2.7Контрольные вопросы
1)Какие объекты Scilab Вам известны?
2)Как называются символы . , : ; () [] {} // % $ ' " ~= и в каково их назначение в Scilab?
3)Что означает в Scilab «определить данные»?
4)Какой символ служит для переноса части командной строки на следующую строку?
5)Для чего используются системные встроенные функции: whos, who,
who_user, typeof, typeи clear?
6)Как в Scilab представлены комплексные числа?
7)Какие системные константы Вам известны?
8)Из каких элементов строятся числовые арифметические выражения?
9)Каков приоритет действий в арифметических выражениях?
10)Какой символ используется для запрета вывода результата вычислений на экран?
11)Какие типы переменных используются в Scilab?
71
12)Чем характеризуются матрицы?
13)Как создать вектор-строку?
14)Как создать вектор-столбец?
15)Какая функция служит для определения длины вектора?
16)Каким образом создать вектор с постоянным шагом?
17)Требуется ли при работе с векторами и матрицами предварительное объявление их размера?
18)Какой символ используются для разделения элементов матрицы в строке, а какой для разделения ее строк?
19)Какие команды предназначены для заполнения матрицы случайными числами, распределенными по равномерному или нормальному закону распределения?
20)Формат команд выбора минимального и максимального значения элемента матрицы.
21)Как записать выражение для решения матричных уравнений?
22)Какие поэлементные матричные операции Вам известны?
23)Как происходит преобразование данных к арифметическому типу?
24)Из каких элементов состоят логические выражения?
25)Как представлены в Scilab строки символов?
26)Что такое форматированный вывод данных?
27)Для чего используется функция mprintf и каков ее формат?
28)Какие символы преобразования вам известны?
29)Что такое списки, структуры и ячейки в Scilab?
30)Какие типы функций пользователя используются в Scilab?
31)Как описываются и вызываются функции, описанные с использованием операторов deff и function?
72
1.3 Матричные операции создания, доступа, извлечения и модификации.
Векторизация и индексирование
1.3.1. Представление данных в Scilab
Из предыдущих разделов известно, что математический пакет Scilab построен как программная система, ориентированная на работу с матрицами. Двумерная структура данных способна хранить данные различного типа. Это могут быть числа, символы, логические значения, полиномы, рациональные дроби и другие объекты. Scilab размещает матрицы всех типов данных в Рабочей области – оперативной памяти компьютера, по столбцам и отображает информацию об активных объектах текущей сессии в окне
Обозревателя переменных.
Из рис. 1.3.1-1, иллюстрирующем матричную структуру представления данных в Scilab, следует, что матрицы могут быть пустыми []; скалярными; векторными, состоящими из одной строки или одного столбца, называемыми соответственно вектор-строкой или вектор-столбцом; квадратными и пря-
моугольными, а их элементы могут быть объектами практически любых типов данных, допустимых в системе Scilab.
Рис. 1.3.1-1 Представление данных в Scilab
При работе с матрицами в матрично-ориентированных программных системах необходимо понимать, как можно создавать различные типы матриц
иосуществлять доступ к ее элементам, и знать правила матричных операций
ифункций.
73
1.3.2. Создание векторов и матриц
Способы создания векторов и матриц
Под созданием матриц понимают создание матриц определенного размера, структуры и содержания (присвоение ее элементам соответствующих значений заданного типа, в том числе и пустых матриц).
Напомним еще раз, что прежде чем выполнять операции с матрицами и их элементами, необходимо создать и присвоить элементам матрицы значения допустимого типа.
ВScilab реализовано несколько различных способов создания векторов
иматриц:
с помощью операции квадратные скобки (операция конструирования
- []);
с помощью соответствующих встроенных функций;
путем объединения уже существующих матриц;
с помощью операции двоеточие (:).
Создание векторов и матриц с помощью операции – []
При создании векторов с помощью операции конструирования, квадрат-
ные скобки используют совместно с операцией присваивания (=). При этом значения элементов векторов, заключенные в [], отделяются друг от друга символами:
точкой с запятой, если нужно создать вектор-столбец;
пробелом или запятой, если нужно создать вектор-строку.
На рис. 1.3.2-1. приведено несколько примеров создания векторов с помощью операции [].
--> // Примеры создания векторов с помощью операции []
-->
--> // Пример1. Создание вектор-строки av из 4-х элементов
--> av = [2 4 -7 5] av =
2. 4. -7. 5. -->
--> // Пример2. Создание вектор-столбца bv из 3-х элементов
--> bv = [0; 3 ;5] bv =
0.
3.
5.
74
-->
--> // Пример3. Создание вектор-столбца сv из 4-х элементов --> // и вектор-строки tv из 4-х элементов
--> cv = [4; 6; -3; 2]; length(cv) ans =
4.
--> tc = cv' tc =
4. 6. -3. 2.
Рис. 1.3.2-1. Примеры создания векторов с помощью операции []
В Примере3 для определения длины вектора использовалась функция length, а для транспонирования матрицы – апостроф (').
При создании матриц с помощью операции [] точно также, как и при создании векторов, необходимо сначала ввести имя матрицы и знак присваивания, а затем в квадратных скобках значения их элементов. При этом значения элементов строк записываются через пробел или запятую, а строки матрицы разделяются точкой с запятой, например, А=[v1;v2;v3], где v1, v2, v3 – вектора одинакового размера (рис.1.3.2-2). Если строки матрицы слишком длинные (Пример3), то ввод очередной строки матрицы можно перенести в следующую строку экрана, нажав после символа точки с запятой клавишу <Enter>.
В Примере1 создается матрица mA1(3,4), а в Примере2 пустая матрица 0×0. Матрица называется пустой, если она имеет число элементов равное нулю, хотя бы в одном измерении. В Примере3 показан ввод элементов матрицы в две строки.
--> // Примеры создания матриц –[]
--> --> // Пример1.Матрица 3х4
--> mA1 = [1 2 3 4;5 6 7 8; 9 10 11 12] mA1 =
1.2. 3. 4.
5.6. 7. 8.
9. 10. 11. 12.
--> --> // Пример2. Матрица 0×0
--> mA2 = [] mA2 =
[]
--> --> // Пример3. Ввод в две строки
--> B=[1.4444 2.78888 3.565555 -4.36789; > 6.4444 2.55555 6.32322 -4.8796]
B=
1.4444 2.78888 3.565555 -4.36789
75
6.4444 2.55555 6.32322 |
-4.8796 |
Рис. 1.3.2-2. Примеры создания матриц с помощью операции []
Создание матриц с помощью встроенных функций
Для создания матриц определенного размера, структуры и содержания в Scilab можно использовать встроенные функции ones, zeros, eye, rand, repmat и некоторые другие, описанные в Приложении 1.3, табл.1.3.2-1.
Перечисленные выше функции имеют следующие назначения: ones –со- здает единичную матрицу; zeros – имеет те же форматы, что и функция ones, но создает матрицу, состоящую из нулей; eye – создает матрицу с единицами на главной диагонали; rand – создает матрицу чисел двойной точности со слу-
чайными вещественными или комплексными элементами; repmat – создает большую матрицу, состоящую из копий другой матрицы, заданной параметром.
Все перечисленные выше функции (кроме функции repmat) в зависимости от входных параметров, создают матрицы в соответствии с заданной размерностью (или того же размера), что и уже существующая матрица, указанная в параметрах.
Рассмотрим несколько примеров по созданию матриц с использованием описанных функций (рис. 1.3.2-3).
--> // Создание матриц с помощью функций
-->
--> A = ones(2, 2) // Матрицы, состоящей из 1
A=
1.1.
1.1.
-->
--> B = zeros(2, 2)// Матрицы, состоящей из 0
B=
0.0.
0.0.
-->
--> C = eye(A) // Матрицы в которой элементы --> // главной диагонали равны 1
C=
1.0.
0.1.
-->
--> r = rand(A) // Матрицы из случайных чисел
r |
= |
|
|
|
|
|
|
|
0.7560439 |
0.3303271 |
|
|
|||
0.2211 |
53811 |
|
|
|
|||
--> |
|
|
|
|
|
|
|
--> |
D = repmat(1:3,2,2) |
|
|
|
|||
D |
= |
|
|
|
|
|
|
|
1. |
2. |
3. |
1. |
2. |
3. |
|
|
1. |
2. |
3. |
1. |
2. |
3. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
76
-->
--> f = testmatrix('frk',3) // МатрицаFranck
f=
3.2. 1.
2.2. 1.
0.1. 1.
Рис. 1.3.2-3. Создание специальных матрицы с помощью встроенных функций
Создание матриц путем объединения существующих
Новую матрицу можно создать и путем объединения уже существующих матриц с помощью операции [] и соответствующих функций. В этом случае операция [] используется не только как конструктор матриц, но и как операция объединения. Например, выражение c=[mA,mB] предполагает горизонтальное сцепление матриц mA и mB, а mC=[mA;mB] их вертикальное объединение
(рис. 1.3.2-4).
--> // |
Примеры матриц, созданных путем объединения |
||||
--> |
|
|
|
|
|
--> // |
Пример1 |
|
|
|
|
--> ma |
= ones(2, 4) * 3; |
|
|
||
--> mb |
= rand(3, 4); |
|
|
||
--> mc = [ma; mb] |
|
|
|||
mc |
= |
|
|
|
|
|
3. |
|
3. |
3. |
3. |
|
3. |
|
3. |
3. |
3. |
|
0.2113249 |
0.3303271 |
0.8497452 |
0.068374 |
|
|
0.7560439 |
0.6653811 |
0.685731 |
0.5608486 |
|
|
0.0002211 |
0.6283918 |
0.8782165 |
0.6623569 |
|
--> |
|
|
|
|
|
--> // |
Пример2 |
|
|
|
|
--> md |
= [5.36, 7.01, [], 9.44] |
|
|||
md |
= |
|
|
|
|
5.367.01 9.44 // Пустая матрица не влияет на формированияmd
Рис. 1.2.3-4 Примеры создания новых матриц путем объединения уже существующих
В Примере1 создается новая матрица mc из матриц ma и mb в вертикальном направлении, а в Примере2 создается новая матрица md из матриц ma и mb в горизонтальном направлении.
Кроме операции объединения в Scilab имеется встроенная функция cat, которая также позволяет объединить существующие матрицы для формирования новой матрицы. Функция cat возвращает матрицу, которая образуется путем сцепления двух или нескольких матриц, перечисленных в параметрах. Эта
77
функция являются альтернативой операции [] для объединения матриц. С
помощью этой функции можно построить новые матрицы вдоль заданного измерения (рис. 1.3.2-5).
--> // Сцепление по строкам и столбцам
-->
--> A = [1 2 3; 6 7 8]; B = [0 8 7; 3 2 1]; --> C = cat(1, A, B) // Сцепление по строкам
C=
1.2. 3.
6.7. 8.
0.8. 7.
3.2. 1.
--> |
// Сцепление по столбцам |
|
||||
--> |
C = cat(2, A, B) |
|
|
|||
C |
= |
|
|
|
|
|
|
1. |
2. |
3. |
0. |
8. |
7. |
6.7. 8. 3. 2. 1.
Рис. 1.2.3-5 Сцепление матриц по строкам и столбцам
Если матрицы объединяются по горизонтали, то они должны иметь одинаковое количество строк. Если матрицы объединяются по вертикали, то матрицы должны иметь одинаковое количество столбцов.
Создание матриц с помощью операции двоеточие – :
Создание векторов и матриц, элементы которых представляют собой некоторую последовательность значений, можно осуществить с помощью опе-
рации двоеточие –(:).
Операция двоеточия позволяет генерировать последовательность значений вектора или строки (столбца) матрицы от n до m (n:m). Причем в этой последовательности каждое последующее значение отличается от предыдущего на 1, даже если конечное значение не является точным значением
(Примеры1-6, рис. 1.3.2-6).
--> // Создание векторов и матриц с помощью – :
--> --> // Пример1
--> vA1 = 10:15 vA1 =
10. 11. 12. 13. 14. 15. --> --> // Пример2
--> vA2 = -2.5:2.5 vA2 =
-2.5 -1.5 -0.5 0.5 1.5 2.5 -->
78
--> |
// |
Пример3 |
|
|
|
--> vA3 = 1:6.3 |
|
|
|||
vA3 |
= |
|
|
|
|
1. 2. 3. 4. 5. 6. |
|
|
|||
--> |
|
|
|
|
|
--> // Пример4 |
|
|
|
||
--> vA4 = 10:5:50 |
|
|
|||
vA4 = |
|
|
|
|
|
|
10. |
15. 20. |
25. 30. 35. 40. 45. 50. |
||
--> |
|
|
|
|
|
--> // |
Пример5 |
|
|
|
|
--> vA5 = 3:0.2:3.8 |
|
|
|||
vA5 = |
|
|
|
|
|
|
3. |
3.2 |
3.4 |
3.6 |
3.8 |
--> |
|
|
|
|
|
--> // |
Пример6 |
|
|
|
|
--> vA = 9:-1:1 |
|
|
|||
vA6 = |
|
|
|
|
|
|
9. 8. 7. 6. |
5. 4. 3. 2. 1. |
|||
--> |
|
|
|
|
|
--> // Пример7 |
|
|
|
||
--> mA=[10:14;-2:2.5;1:5.3;5:-1:1] |
|||||
mA |
= |
|
|
|
|
10.11. 12. 13. 14.
-2. |
-1. |
0. |
1. |
2. |
1. |
2. |
3. |
4. |
5. |
5.4. 3. 2. 1.
Рис. 1.3.2-6 Создание векторов и матриц с помощью операции двоеточие
Если шаг изменения последовательности значений отличается от 1, то необходимо указать значение шага h (n:h:m). Причем шаг может быть, как положительным, так и отрицательным. В Примере7 показано создание матрицы, элементы каждой строки которой генерируются в различных диапазонах и с разными шагами. Используя такой способ задания матриц, следует помнить, что в каждой строке матрицы должно быть одинаковое количество элементов. В случае ошибки система выводит сообщение:
«несовпадающие размеры строки/столбца».
Динамическое изменение размера матрицы
Матрицы могут динамически изменять свой размер в процессе выполнения программы с помощью функций matrix и resize_matrix. Это позволяет адаптировать размер уже созданной матрицы к тем данным, которые ей предстоит хранить (рис. 1.3.2-7).
--> // Динамическое изменение размеров матриц
-->
79
--> А = [1 2 3; 4 5 6] // Исходная матрица
А=
1.2. 3.
4.5. 6.
--> А(3, 1) = 7 // Изменение размера матрицы путем дополнения элемента
А=
1.2. 3.
4.5. 6.
7. 0. 0.
--> --> А(:, 3) = [] // Удаление 3-го столбца
А=
1.2.
4.5.
7.0.
-->
--> // Создание вектора заданного размера из матрицы А
--> В = matrix(А, 1, 6)
В=
1.4. 7. 2. 5. 0.
--> --> // Создание матрицы (3х4) по экспоненциальному закону распределения
--> |
M = grand(3, 4, 'exp', 5) // с математическим ожиданием 5 |
|||
M |
= |
|
|
|
|
3.1472369 |
0.7660456 |
0.472206 |
0.4688152 |
|
7.350552 |
4.6290769 |
4.0357003 |
3.3184658 |
|
0.4401028 |
13.20044 |
9.4667509 |
0.5462453 |
--> |
|
|
|
|
--> |
M1 = resize_matrix(M, 2, 2)// Изменение размера матрицы М(3х4) на М1(2х2) |
|||
M1 |
= |
|
|
|
|
3.1472369 |
0.7660456 |
|
|
|
7.350552 |
4.6290769 |
|
|
Рис. 1.3.2-7 Примеры динамического изменения размеров матриц
На рис. 1.3.2-7 создана матрица А(2,3). Далее в эту матрицу добавлен элемент с индексами (3,1). Добавление элемента вызывает в матрице А создание третьей строки, где первому элементу в ней будет присвоено значение 7, а значения остальных элементов данной строки будут установлены в 0. Таким образом, размер матрицы может увеличиваться динамически.
Далее приведен пример динамического уменьшения размера матрицы, где для удаления третьего столбца матрицы А, используется обозначение пустой матрицы [].
Полностью изменить размер матрицы можно с использованием функции matrix. Эта функция трансформирует исходную матрицу в матрицу другого размера, копируя элементы столбец за столбцом. В следующем примере матрица А размером 3х2=6 преобразуется в вектор-строку с 6 элементами.
В последнем примере (рис. 1.3.2-7) с использованием функции grand создана матрица М размером (3х4), элементы которой распределены по экспонен-
80