scilab учебник. Учебник Scilab. Учебник Для студентов по дисциплин Базовые средства математических пакетов
Скачать 5.73 Mb.
|
mprintf и каков ее формат? 28) Какие символы преобразования вам известны? 29) Что такое списки, структуры и ячейки в Scilab? 30) Какие типы функций пользователя используются в Scilab? 31) Как описываются и вызываются функции, описанные с использова- нием операторов deff и function ? 73 1.3 Матричные операции создания, доступа, извлечения и модификации. Векторизация и индексирование 1.3.1. Представление данных в Scilab Из предыдущих разделов известно, что математический пакет Scilab по- строен как программная система, ориентированная на работу с матрицами. Двумерная структура данных способна хранить данные различного типа. Это могут быть числа, символы, логические значения, полиномы, рациональные дроби и другие объекты. Scilab размещает матрицы всех типов данных в Рабочей области – оперативной памяти компьютера, по столбцам и отобра- жает информацию об активных объектах текущей сессии в окне Обозревателя переменных. Из рис. 1.3.1-1, иллюстрирующем матричную структуру представления данных в Scilab, следует, что матрицы могут быть пустыми [] ; скалярными; векторными, состоящими из одной строки или одного столбца, называемыми соответственно вектор-строкой или вектор-столбцом; квадратными и пря- моугольными, а их элементы могут быть объектами практически любых типов данных, допустимых в системе Scilab. Рис. 1.3.1-1 Представление данных в Scilab При работе с матрицами в матрично-ориентированных программных си- стемах необходимо понимать, как можно создавать различные типы матриц и осуществлять доступ к ее элементам, и знать правила матричных операций и функций. 74 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. 75 --> --> // Пример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 ), то ввод очередной строки матрицы можно перенести в следующую строку экрана, нажав после символа точки с запятой клавишу В Примере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 76 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. 77 --> --> 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.36 7.01 9.44 // Пустая матрица не влияет на формированияmd Рис. 1.2.3-4 Примеры создания новых матриц путем объединения уже существующих В Примере1 создается новая матрица mc из матриц ma и mb в вертикальном направлении, а в Примере2 создается новая матрица m d из матриц ma и mb в гори- зонтальном направлении. Кроме операции объединения в Scilab имеется встроенная функция cat , которая также позволяет объединить существующие матрицы для формирова- ния новой матрицы. Функция cat возвращает матрицу, которая образуется пу- тем сцепления двух или нескольких матриц, перечисленных в параметрах. Эта 78 функция являются альтернативой операции [] для объединения матриц. С помощью этой функции можно построить новые матрицы вдоль заданного из- мерения (рис. 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 --> 79 --> // Пример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). --> // Динамическое изменение размеров матриц --> 80 --> А = [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) , элементы которой распределены по экспонен- 81 циальному закону распределения с математическим ожиданием 5 . Размер мат- рицы изменен с использованием функции resize_matrix. Таким образом мат- рица М(3х4) стала матрицей М1(2х2) Функция size позволяет проверить размер матрицы и возвращает два параметра n и m , значения которых равны, соответственно, числу строк и столб- цов в данной матрице (рис. 1.3.2-8). --> // Динамическое изменение размеров матриц --> --> А = [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 2 3; 4 5 6] // Исходная матрица А = 1. 2. 3. 4. 5. 6. 82 --> А(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 Примеры динамического изменения размеров матриц Кроме формата size(А) , функция size может имеет и другой формат: nm |