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

Учебник Математические пакеты

.pdf
Скачиваний:
43
Добавлен:
23.12.2022
Размер:
6.39 Mб
Скачать

4.

--> 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