scilab учебник. Учебник Scilab. Учебник Для студентов по дисциплин Базовые средства математических пакетов
Скачать 5.73 Mb.
|
: ), ссылаясь на все элементы (или часть элементов) в строке (или столбце) матрицы, так и ко всем элементам матрицы (Приложение 1.3, табл. 1.3.3-2 ). 1.3.4. Операции и функции с матрицами В п.1.2.2 уже рассматривалась операция присваивания значений отдель- ным элементам матрицы и всей матрице, а на рис. 1.2.2-2–1.2.2-5, были приве- дены примеры с использованием этих операций. Поэтому достаточно только напомнить, что операции для числовых данных без точки действуют в соот- ветствии с правилами линейной алгебры, а операции с точкой осуществляют поэлементные операции над элементами массивов. В Scilab имеется большое число функций, которые вычисляют различ- ные характеристики матриц. Некоторые из них приведены в Приложении 1.3, табл. 1.3.4-1. Напомним, что функции, определяющие структуру матриц приведены в Приложении 1.2, табл. 1.2.2-4. Немаловажную роль в Scilab играют так называемые пустые матрицы. Базой для пустых матриц является то, что любая операция, определенная для матрицы m×n , должна быть разрешена даже, если m или n равны нулю. Раз- мер результата этой операции соответствует результату, получаемому при ра- боте с непустыми значениями, но все значения равны 0 Например, горизонтальная конкатенация (объединение) C=[A B] тре- бует, чтобы матрицы A и B имели одинаковое количество строк. То есть, что если A – матрица размером m×n, а B - матрица размером m×p , то матрица C будет размером m×(n+p) . Это будет по-прежнему верно, если m , n или p равно нулю. На рис.1.3.4-1 приведены некоторые общие операции, которые возвра- щают ненулевые значения в пустом массиве. 93 // Общие операции в пустом массиве --> A = []; //создание пустой матрицы --> ndims(A) //определение размера матрицы ans = 2. --> prod(A) //произведение элементов массива ans = 1. --> isreal(A) //проверка, является ли А пустой матрицей ans = T --> isempty(A) //проверка, является ли А вещественной или комплексной ans = T Рис.1.3.4-1. Операции, возвращающие ненулевое значение в пустом массиве Все поэлементные операции над пустыми матрицами считаются дей- ствительными до тех пор, пока согласованы размеры операндов, или непустой операнд является скалярным. Поэлементные операции над пустыми матри- цами всегда возвращают пустую матрицу (рис.1.3.4-2) Любое вещественное или комплексное число представлено в Scilab как матрица 1×1 , называемая скалярным значением, однако к нему также приме- нимы некоторые функции над матрицами (рис. 1.3.4-2). --> // Проверка характеристик матрицы1х1 --> --> // А – матрица1х1 --> A = 5; --> ndims(A) // Проверка количества измерений вА ans = 2. --> size(A) // Проверка значений строк и столбцов ans = 1. 1. --> isscalar(A) // Проверка, имеет ли A скалярное значение ans = T Рис. 1.3.4-2. Проверка характеристик матрицы 1х1 Матрицы, у которых одно измерение равно единице, а другое больше единицы, как известно, называются векторами. Пример числового вектора, с элементами различных числовых типов приведен на рис.1.3.4-3. --> // Пример числового вектора --> 94 --> A = [5.73, 2 - 4*%i, 9/7, 25*%e, .046, sqrt(32), %i*8]; --> size(A) // Определение числа строк и столбцов ans = 1. 7. Рис. 1.3.4-3. Пример числового вектора Вектор может быть построен из других векторов, если, конечно, пра- вильно согласованы их размеры. Все компоненты вектора строки должны быть скалярами или другими векторами строк (рис.1.3.4-4). Аналогично, все компоненты вектора столбца должны быть скалярами или другими векторами столбцов. --> // Пример построения вектора из других векторов --> --> A = [29 43 77 9 21]; --> B = [0 46 11]; --> C = [A 5 1 B] C = 29. 43. 77. 9. 21. 5. 1. 0. 46. 11. --> --> A = [5.36; 7.01; []; 9.44] // Объединение с пустым вектором A = 5.36 7.01 9.44 --> isvector(A) // Функция, определяющая, является ли переменная вектором ans = T Рис.1.3.4-4 Пример построения векторов из других векторов Из примеров, приведенных на рис 1.3.4-4, следует, что конкатенация пу- стой матрицы с вектором не влияет на результирующий вектор. В этом случае пустая матрица просто игнорируется, а проверить, является ли переменная вектором можно с использованием функции isvector 1.3.5. Логическая индексация Естественным продолжением операций над матрицами и их элементами является векторизация операций сравнения, поиска, принятия решений и ло- гических операций (п. 1.2.3). Напомним, что операции сравнения и логические 95 операции в Scilab над массивами возвращают в качестве результата массив ло- гического типа со значениями элементов %F и %T Логическое индексирование матрицы Логическое индексирование матрицы А логической матрицей L , обозна- чаемое как А(L) , возвращает такие элементы массива А , которые соответствуют позиции в массиве индексирования L и имеют значения %T (True). При этой операции каждый элемент со значением %T в массиве индексации L рассматривается как позиционный индекс в массиве A , к которому осуществ- ляется доступ. Логические массивы позволяют во многих случаях обходиться без опе- раторов цикла (п. 1.5.4), поэтому хороший уровень программирования в среде Scilab требует умения применять логическое индексирование. Таким образом, если элементы логического массива L , являясь индек- сами массива A, то они определяют позиции элементов массива A и эта индек- сация соответствует их позициямв массиве L Scilab содержит специальные системные значения для определения пе- реполнения, потери значимости и неопределенности операторов, таких как Inf и NaN . Чтобы помочь выполнять логические тесты для этих специальных значений существуют логические операторы isinf и isnan , поскольку часто элементы массива, имеющие значения NaN, нужно исключить из вычислений. С помощью операций & и | Scilab позволяет выполнить соответствую- щие логические операции « и» и « или», причем над элементами всего вектора. Рассмотрим несколько примеров на использования логической индекса- ции векторов (рис. 1.3.5-1). --> // Примеры логической индексации --> --> vD = [-0.2, 1.0, 1.5, 3.0, -1.0, 4.2, 3.14]; --> // Пример1 --> iV1 = vD>= 0 iV1 = FTTTFTT --> --> // Пример2 --> vP1 = vD(iV1 == %T) // илиvP1 = vD(vD>= 0) vP1 = 1. 1.5 3. 4.2 3.14 --> --> // Пример3 --> vP2 = vD(iV1 = %T) // или vP1 = vD(vD<= 0) vP2 = -0.2 -1. --> --> // Пример4 --> vP3 = vD((vD>= 0) & (vD< 3)) 96 vP3 = 4.2 3.14 --> --> // Пример5 --> x = [2 -1 0 3 %nan 2 %nan 11 4 %inf] x = 1. -1. 0. 3. Nan 2. Nan 11. 4. Inf --> --> // Пример6 --> xvalid = x(isnan(x)) xvalid = 2. -1. 0. 3. 2. 11. 4. Inf Рис. 1.3.5-1 Примеры логической индексации векторов В Примере1 формируется матрица логических индексов iV1 , соответству- ющих условию vD>=0 В Примере2 возвращаются элементы матрицы iP1 , соот- ветствующие позиции в матрице индексирования ivD и имеющие значения %T. Эти примеры можно проиллюстрировать на рис. 1.3.5-2. -0.2 F -0.2 1.0 T 1.0 1.0 1.5 T 1.5 1.5 .0 T 3.0 3.0 -1.0 vD >= 0 F vD(ivD) -1.0 vP1 = vD(iV1) 4.2 4.2 T 4.2 3.4 3.4 T 3.4 VP1 vD iV1 vD Рис. 1.3.5-2 Иллюстрация примеров из рис. 1.3.5-2 В Примере3 возвращаются элементы матрицы vP2 , соответствующие по- зиции в матрице индексирования vD , значения которых %F В Примере4 возвра- щаются элементы матрицы vP3 , соответствующие условию, что элементы мат- рицы vD положительны и больше 3 . В Примере5 формируется матрица х , которая используется в Примере6 , для формирования матрицы xvalid путем исключения из матрицы х элементов, имеющих значение NaN Рассмотрим пример создания матрицы А размерностью 3×3 и вычисле- ние логической матрицы L , удовлетворяющей условию A>0.5 Далее используя полученную матрицу L для индексирования матрицы A, присвоим соответ- ствующим элементам матрицы A , значение равное 0 Решение данного примера приведено на рис.1.3.5-2. --> // Пример логического индексирования массива А --> A = rand(3, 3) A = 97 0.7560439 0.6653811 0.685731 0.0002211 0.6283918 0.8782165 0.3303271 0.8497452 0.068374 --> L = A > 0.5 L = T T T F T T F T F --> A(L) = 0 A = 0. 0. 0. 0.0002211 0. 0. 0.3303271 0. 0.068374 // Более короткое решениеA (A> 0.5) = 0; Рис. 1.3.5-2 Пример логического индексирования массива А В Приложении1.3, табл. 1.3.5-1рассмотрены дополнительные при- меры логического индексирования матриц, где L является матрицей логиче- ских значений. Использование функции find В дополнение к примерам, приведенным в Приложении 1.3.5, табл. 1.3.5-1, необходимо знать следующее: чтобы найти такие элементы мат- рицы, которые удовлетворяют условию, можно использовать функцию find в сочетании с логическим выражением. Например , find(X<5) возвращает линей- ные индексы для элементов X , которые имеют значения менее 5 Чтобы непосредственно найти элементы массива X , которые удовлетво- ряют условию X<5 , можно использовать конструкцию X(X<5) , и при этом сле- дует избегать таких конструкций как X(find(X<5)) , которые необоснованно ис- пользуют функцию find с логической матрицей. В Приложении 1.3, табл. 1.3.5-2приведено описание функции find, gsort, vectorfind. Обратите внимание, что если после ввода элементов матриц или вектороввыявлены ошибки, то для исправления отдельных значений элементов можно воспользоваться окном Редактора данных. В большинстве случаев при логическом индексировании матрицы должны иметь одинаковое количество элементов, как индексируемых, так и индексирующих, но это не является жестким требованием. Индексирующие матрицы могут иметь и меньшие (но не большие) размеры (рис. 1.3.5-3). --> // Пример на логическое индексирование, при котором индексирующая 98 --> // матрица имеет размер меньше чем размер индексируемой матрицы --> --> A = [1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9 --> B = ([%f %t %f; %t %f %t]) B = F T F T F T --> --> isequal( prod(size(A)) , prod(size(B)) ) ans = F --> --> A(B) ans = 4 7 8 --> --> C = [B(:); %f; %t; %f]; --> isequal( size (A), size (C)) ans = 1 --> A(C) ans = 4 7 8 Рис. 1.3.5-3 Пример на логическое индексирование, при котором индексирующая и индексируемые матрицы имеют разные размеры Обратите внимание, что при логическом индексировании всегда возвращается вектор- столбец, а также, что Scilab обрабатывает отсутствующие элементы индексирую- щих матриц так, как если бы они присутствовали и были равными %f 1.3.6. Создание и использование массивов структур и массивов ячеек Тип данных массив ов структур В Scilab для формирования массивов структур существуют два основ- ных варианта. Первый заключается в использовании функции struct , аргумен- 99 тами которой выступают названия полей структуры и соответствующие зна- чения. Названия полей должны быть строковыми переменными, а значения в этих полях могут иметь любой допустимый тип. Второй вариант создания структуры состоит в использовании оператора присваивания и точечной нотации: Переменная=ИмяСтруктуры.ИмяПоля, возвращает значение ИмяПоля структуры с указанным вслед за ним именем Имя- Структуры . Если такая структура уже существует, то значение будет выведено на экран, а если отсутствует, то она создается автоматически. При этом си- стемная функция whos будет выводить только информацию о самой структуре, но не выводит , ни ИмяПоля , ни содержимое этих полей. Для просмотра этой ин- формации можно или обращаться специально к отдельным полям структуры, или использовать редактор переменных Variables . Структура в памяти зани- мает больше места, чем суммарный размер её полей, поскольку в памяти хра- нятся имена полей, а каждое имя поля – это переменная типа char , и каждый символ в этом имени занимает по два байта. В Scilab имеется возможность создавать также матрицы структур. Для создания таких матриц после имени структуры перед точкой в круглых скоб- ках указывается индекс. Кстати, массив из двух структур занимает в памяти меньше места, чем две структуры по отдельности. Структуры очень часто ис- пользуются во встроенных и внешних функциях. Этот тип данных чрезвы- чайно удобен для генерирования отчетов и упорядочивания большого количе- ства схожей информации. Массивы ячеек и доступ к элементам массива ячеек Если связанные между собой данные имеют разные типы, то их можно сохранить путем объединения в массив ячеек, где ячейка содержит часть дан- ных. Ссылка на элементы массива ячеек производится с использованием ин- дексирования. При этом для индексирования массива ячеек используются круглые скобки () , а для индексирования содержимого ячеек, используются фигурные скобки {} Массивы ячеек удобны для структурирования разнородной информа- ции. Для доступа к данным, хранящимся в структуре, необходимо знать назва- ния полей структуры, тогда как для доступа к данным массива ячеек нужны только индексы, указывающие на конкретную ячейку. Самый простой вариант создания ячейки состоит в использовании фигурных скобок {}. Элементы од- ной строки массива отделяются друг от друга запятой, а столбцы точкой с за- пятой. Массивы ячеек в этом отношении аналогичны матрицам, но без огра- 100 ничений на типы данных, находящихся внутри ячеек. В ячейке может нахо- диться структура или массив ячеек. Для удобного просмотра содержимого массивов следует также использовать окно Редактор переменных. Кроме того, тип данных 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] [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 = 101 [0x0 constant] [0x0 constant] [0x0 constant] [0x0 constant] Рис. 1.3.6-1 Создание векторов ячеек для хранения данных разных типов На рис. 1.3.6-1 задан вектор ячеек Vcell с тремя элементами. Первый эле- мент соответствует структуре, второй – строке, а третий – числу. В этом и за- ключается особенность организации данных с помощью ячеек: у каждого эле- мента свой тип данных. Для обращения к содержимому той или иной ячейки используются фи- гурные скобки, внутри которых ставится индекс элемента, с которым предпо- лагается работать. Если же используются круглые скобки, то будет возвра- щена структура данных вместо отдельных значений. Для того чтобы задать вектор или матрицу ячеек с пустыми (неопреде- ленными) значениями, используется функция |