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

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

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

Операции отношения выполняют поэлементное сравнение значений векторов или матриц одинакового размера и возвращают значение равное T, если имеет место полное совпадение, и значение Fв противном случае.

Операции <, <=, >, >= при комплексных операндах используются для сравнения только действительных частей операндов – мнимые отбрасываются. В то же время операции == и ~= ведут сравнения с учетом как действительной, так и мнимой части операндов.

Логические выражения обычно используются в операторах if, for, while, switch и служат для изменения последовательности выполнения опера-

торов программы Scilab, а также при логической индексации матриц.

При вычислении выражений операции отношения имеют более низкий приоритет, чем арифметические операции, но более высокий, чем логические.

На рис. 1.2.3-1 приведены примеры вычисления логических выражений.

--> // Примеры логических выражений

--> --> // Пример1. Логическое умножение векторов

--> vF = [%T %F %F]; vK = [%T %T %F]; --> vF & vK

ans = T F F

--> --> // Пример2. Логическое сложение матриц

--> mA = [%F %T %F; %F %T %T; %T %T %F]; --> mB = [%T%T %F; %T %T %T;%T %T %F];

--> IL = mA | mB IL =

T T F

T T T

T T F -->

--> // Пример3. Умножение элементов вектора на константу

--> vF = [%T %F %F]; --> vF .* %F

ans =

0. 0. 0.

Рис. 1.2.3-1 Примеры логических выражений

Обратите внимание, что операнды операций отношения и логических операций должны иметь совместимые размеры.

Список логических операций и функций приведен в табл. 1.2.3-2.

41

Логические операции. Таблица 1.2.3-2

Операция

Описание

 

Примеры *

 

Логическое сложение (операция ИЛИ) над

-->

or([])

 

элементами вектора или матрицы

ans

=

 

 

 

F

 

 

 

Где b - логический скаляр, если or(A) исполь-

 

 

 

 

зуется без каких-либо вариантов "r", "c", n

-->

or(0)

b = or(A)

(по умолчанию).

ans

=

 

 

bравно %F, если все элементы A имеют значе-

F

 

 

 

ние %F или ноль, включая %nan.

 

 

 

 

b равно , в противном случае (по крайней

-->

or(0+%i * 0)

 

мере один элемент A имеют значение %T или

ans

=

 

 

ненулевой.

F

 

 

 

 

-->

or(%nan)

 

 

ans

=

 

 

 

F

 

 

 

 

-->

or([T, F T])

 

 

ans

=

 

 

 

T

 

 

 

 

-->

or([1 0 1; 0 4 3])

 

 

ans

=

 

 

 

T

 

 

 

Логическое сложение (операция ИЛИ) над

-->

B = or(A, 1)

 

элементами столбцов или строк

B

=

 

 

матрицы

T T F

 

Где B - логический вектор.

-->

B = or(A, 2)

 

Если n = 1 или| "r": or – возвращает вектор-

B

=

 

 

строку логических значений

T

 

 

B = or(A, 'r')

B(j) = or(A(:, j)).

T

 

 

B = or(A, 1)

 

T

 

 

 

Если n = 2 или " c": or возвращает вектор-

 

 

 

 

столбец логических значений

 

 

 

 

B(i) = or(A(i, :))

 

 

 

B = or(A, 'c')

 

 

 

 

B = or(A, 2)

 

 

 

 

 

Поэлементное логическое сложение (опера-

-->

x = [1 0 0];

 

ция ИЛИ) над элементами векторов или

-->

y = [1 1 1];

 

матриц

-->

L = x | y

 

 

L

=

 

 

Где A и B вектора или матрицы с элементами

T

T T

L = A | B

целого или логического типа, которые должны

 

 

 

 

иметь одинаковые размеры.

-->

y = [1 0 1];

 

Если A или B является скаляром, она заранее

-->

L = x | y

 

расширяется до размера другого операнда.

L =

 

 

 

L – вектор или матрица логических значений

T

F T

 

 

 

 

Логическое умножение (операция И) над

-->and([])

 

элементами вектора или матрицы

ans

=

 

 

 

T

 

 

 

Где b - логический скаляр, если

 

 

 

b = and(A)

and(A) используется без каких-либо вариан-

-->

and(0)

 

тов "r", "c", n (по умолчанию).

ans

=

 

 

B равно %F, если хотя бы один из элементов A

F

 

 

 

имеют значение %F или ноль.

 

 

 

 

 

-->

and(0 + 0*%i)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

42

 

 

 

 

 

 

 

B равно , в противном случае (все элементы

ans

=

 

 

 

A имеют значение %T, ненулевое или %nan.

F

 

 

 

 

Где A вектор или матрица булевых, целочис-

 

 

 

 

 

ленных действительных или комплексных

-->

and(%nan)

 

 

значений

ans

=

 

 

 

 

T

 

 

 

 

 

-->

and([1, 0 1])

 

 

 

ans

=

 

 

 

 

F

 

 

 

 

 

-->

and([1 0 1; 0 4 3])

 

 

 

ans

=

 

 

 

 

F

 

 

 

 

Логическое умножение (операция И) над

-->

B =

and (A, 1)

 

 

элементами столбцов или строк

B

=

 

 

 

матрицы

T

F F

 

 

 

Где B вектор логических значений.

-->

B =

and (A, 2)

 

 

and возвращает вектор-строку логических

B

=

 

B =

and (A, 'r')

значений

T

 

 

B =

and (A, 1)

b(j) = and(A(:, j));

F

 

 

 

 

 

F

 

 

 

 

and возвращает вектор-столбец логических

 

 

 

B =

and (A, 'c')

значений

 

 

 

B =

and (A, 2)

b(i) = and(A(i, :)) ;

 

 

 

 

 

 

 

 

 

 

Логическое умножение (операция И) над

-->

x = [1 0 0];

 

 

векторами или матрицами

-->

y = [1 1 1];

 

 

 

-->

L = x & y

 

 

Где A и B вектора или матрицы с элементами

L

=

 

 

 

целого или логического типа, которые должны

T F F

 

L = A & B

иметь одинаковые размеры.

 

 

 

 

 

Если A или B является скаляром, она заранее

-->

y = [1 0 1];

 

 

расширяется до размера другого операнда.

-->

L = x & y

 

 

L – вектор или матрица логических значений

L

=

 

 

 

 

T F F

 

 

 

 

 

 

~A

 

Логическое отрицание (операция НЕ) над

-->

x = [1 0 0];

 

 

элементами матрицы логических значений

-->

~x

 

 

 

 

ans =

 

 

 

 

T

F F

 

 

 

 

-->

y = [1 1 1];

 

 

 

-->

oy = ~y

 

 

 

oy

=

 

 

 

 

T

F F

 

*В примерах используются:

вектора x = [1 0 0] и y = [1 1 1];

матрицы А = [5 7 0; 3 2 4; 5 0 0] и B = [6 6 0; 1 3 5; -1 0 0].

43

1.2.4. Строки символов и форматирование данных

Строки символов

Строковая константа представляется в Scilab заключением символов в одинарные или двойные кавычки, а скалярная переменная (матрица 1×1) присвоением этой переменной значения символьной константы (рис.1.2.4-1).

--> // Создание данных строкового типа

--> --> // Создание символьных переменных

--> a = 'Система ', b = "Scilab"

a=

Система

b=

Scilab -->

--> // Создание символьной матрицы

--> mSt = ['Мы ' 'изучаем' 'Scilab' ' 6'] mSt =

!Мы изучаем Scilab6! --> size(mSt)

ans =

1.4.

--> length(mSt) ans =

3.7. 7. 2.

Рис. 1.2.4-1 Создание данных строкового типа

Для создания матрицы строк используется тот же синтаксис, что и для матриц арифметического типа. В примере, приведенном на рис.1.2.4-1, создана матрица строк размером 1×4 'Мы изучаем Scilab6'. Для того, чтобы вычислить ее размер, использована, как для обычных матриц, функция size, а для вычисления числа символов в каждом элементе матрицы – функция length.

В оперативной памяти строка представляет собой последовательность кодов символов, из которых она образуется. Однако, после создания строки, она представляется для пользователя единым целым, поэтому без специальных функций при работе со строками невозможно использовать отдельные символы строки.

Следует помнить, что строки поддерживают лишь операцию конкатенации (объединения), которая обозначается символом плюс (+)

(рис.1.2.4-2).

44

--> // Объединение строк

-->

--> a = 'Система'; b = "Scilab"; --> c = a +' ' + b

c =

Система Scilab

Рис. 1.2.4-2. Выполнение над строками операции конкатенации

В системе Scilab имеется множество встроенных функций обработки строковых типов данных. Наиболее востребованными функциями, которые используются при работе со строками, являются функции string и strtod. Функция string позволяет преобразовать свой входной параметр из любого типа данных в строку символов, а функция strtod позволяет преобразовать свою входную строку цифровых символов в число (рис. 1.2.4-3).

-->

// Использование строковых функций

 

--> x = [1 2 3 4 5]; // Вектор х

 

-->

 

 

 

--> // Пример1. Преобразование х в строку

 

--> str = string(x)

 

str

 

=

 

!1

2

3 4 5 !

 

-->

 

 

 

--> // Пример2. Определение типа str

 

--> typeof(str)

 

ans

 

=

 

string

 

 

-->

 

 

 

--> // Пример3. Str - матрица размером 1х5

 

--> size(str)

 

ans

 

=

 

1.

5.

 

-->

 

 

 

--> // Пример4. Преобразование '10' в число

 

--> a = 2;

 

--> c1 = a + strtod('10')

 

c1

=

 

 

12.

 

 

 

Рис. 1.2.4-3 Примеры использования строковых функций

В Примере1 вектор чисел х преобразован в массив строк str с использованием функции string, где каждая строка массива состоит из одного символа. Затем, в Примере2 с использованием функции typeof проведена проверка того, что переменная str действительно является строкой, а в Примере3 использо-

45

вана функция typeof, выполнение которой показало, что переменная str является матрицей строк размером 1×5. В Примере4 показано преобразование строковой константы '10'в число 10.

Рассмотрим еще одну функцию, которая используется при работе со строками. Функция strcat объединяет свой первый входной аргумент с разделителем, определённым во втором входном аргументе (рис. 1.2.4-4). В приведенном примере функция strcat используется для получения новой строки.

--> // Использования функций strcat

-->

--> strcat(["1" "2" "3" "4" "5"]," + ") ans =

1 + 2 + 3 + 4 + 5

Рис. 1.2.4-4 Пример использования функций strcat

Форматирование строковых данных

При выводе данных в удобном для пользователя формате в Scilab имеется несколько функций, позволяющих выполнить преобразование произвольных типов данных в текстовые данные и производить управление их форматом:

mprintf – преобразует, форматирует и отображает данные в

командном окне;

mfprintf – преобразует, форматирует и записывает данные в файл;

msprintf – преобразует, форматирует и записывает данные в строку.

Форматирование в этих функциях (выравнивание, число значащих цифр и так далее) осуществляется с использованием определенных элементов нотаций (системой условных обозначений). Они аналогичны тем, которые используются для форматирования строковых данных в языке C++. Например, формат %f преобразует значения с плавающей точкой к соответствующему строковому формату, а формат %.2f, представляют две цифр после десятичного знака, формат %12f представляет при выводе 12символов, заполняя по мере необходимости незначащие символы пробелами. Кроме того, имеется возможность комбинировать элементы формата с обычным текстом и специальными непечатными управляющими символов escape-символами, такими, например, как символ новой строки \n.

Строка, содержащая элементы форматирования, может иметь шесть элементов. Справа налево эти элементы представляют: символ преобразования,

подтип, точность, ширина поля, флаги и числовой идентификатор.

В общем виде функции форматирования данных имеют следующий вид:

mprintf(Формат,СписокПеременных); mfprintf(Формат,СписокПеременных);

46

msprintf(Формат,СписокПеременных).

Работу перечисленных выше функций рассмотрим на примере функции

mprintf:

Строка=mprintf(Формат,СписокПеременных),

где Строка – строковая переменная; Формат – параметр, который является стро-

кой, содержащей символы преобразования (форматирования); СписокПеременных

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

Каждый Формат является строкой символов, который начинается с символа %, и сообщает всё о переменной, значение которой нужно подставить: её тип и модификаторы (ширина, точность, размер):

Формат='%ФлагиШирина.ТочностьРазмерТип'.

Ни один из перечисленных элементов не является обязательным, кроме элемента Тип, а часть элементов формата относятся только к некоторым типам данных. Например, ширина, точность и размер – относятся только к числам.

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

Рассмотрим основные допустимые символы преобразования строки Формат подробнее.

В соответствии с синтаксисом, формат преобразования начинается

ссимвола % и содержит следующие необязательные и обязательные элементы:

флаги (необязательно);

поля ширины и точности (опционные);

спецификатор подтипа (необязательно);

символ типа (преобразования) (обязательный).

Эти элементы задаются в порядке, показанном в примере на рис. 1.2.4-5

Рис. 1.2.4-5 Пример строки форматирования

47

Символы преобразования, указывающие нотацию (систему условных обозначений) для преобразования выходных данных, приведены в

табл. 1.2.4-1.

 

Символы преобразования и примеры их применения. Таблица 1.2.4-1

Символ

Описание

 

 

%c

Выводит одиночный символ

 

 

%d

Выводит десятичное число

 

 

%e

Выводит десятичные числа с плавающей точкой в экспоненциальном виде

 

 

%E

Так же, как %e, но, используя прописные

 

 

%f

Выводит десятичные числа с плавающей запятой

 

 

%g

Более компактное %e или %f, незначительные нули не выводятся.

 

 

%G

Выводит десятичного целого числа (представление числа с основанием 10)

 

 

%i

Выводит целую часть десятичного числа (представление числа с основанием 10)

 

 

%s

Выводит строку символов

 

 

%u

Выводит целую часть десятичного числа без знака (представление числа с основа-

 

нием 10)

 

 

Ширина и точность поля позволяют управлять шириной и точностью выходных данных (табл. 1.2.4-2).

Ширина и точность полей. Таблица 1.2.4-2

Характер

Описание

Пример

 

 

 

 

 

Ширина поля

Строка цифр, указывающая минимальное ко-

('%5d', 0)

0

 

личество цифр для печати

('%5d', 7)

7

 

 

('%5d', -9)

-9

 

 

('%5d', 45622)

45622

 

 

('%5d', 4562237)

45622

 

 

 

 

Точность

Строка цифр, включающая точку (.) указание

('%.0f', e)

3

 

количества цифр, которые должны быть

('%.0f.', e)

3

 

напечатаны справа от десятичной точки

('%.1f', e)

2.7

 

 

('%.2f', e)

2.72

 

 

('%.5f', e)

2.71828

 

 

('%f', e)

2.718282

 

 

 

 

Например, если указать спецификатор формата %5d, то будет гарантировано, что вывод числа всегда занимает 5 символьных позиций (если нужно, то больше, но не меньше). Эта возможность очень полезна при печати таблиц, потому что и большие, и маленькие числа займут в строке одинаковое число позиций.

48

Следует иметь в виду, что результат вывода будет дополнен до необходимой указанной ширины слева. При этом большие числа, которые требуют для печати большее количество символов, будут выведены полностью.

Поле опции ширины должно быть указано таким, чтобы удовлетворять максимальному размеру ожидаемого выводимого числа. Например, если числа могут состоять из 1, 2 или максимум 3 цифр, то формат %3d подойдет. Опция ширины будет работать неправильно, если потребуется отобразить слишком большое число, которое не умещается в заданной ширине поля.

Числа с плавающей точкой (например, 3.1415) содержат точку, тогда как числа целого типа (например, 27) не имеют такой точки. Для печати чисел с плавающей точкой (double) флаги и правила работают точно так же, как и для целых чисел, но имеют несколько новых опций. Самая важная опция указывает, какое количество цифр может появиться после десятичной точки. Это количество цифр называется точностью (precision) числа.

В табл. 1.2.4-3 приведены примеры возможных вариантов вывода числа

e=2.718281828.

Флаги форматирования. Таблица 1.2.4-3

Характер

Описание

Пример

 

 

 

 

 

Знак минус (-)

Левое выравнивание

('%-5.1f', e)

2.7__

 

 

 

 

Знак плюс (+)

Всегда печатает знак (+или -)

('%+5.1f', e)

_+2.7

 

 

 

 

Ноль (0)

Отображаются нул, а не пробелы

('%05.1f', e)

002.7

 

 

 

 

Знак плюс (+) или (-)

 

('%+-5.1f', e)

_+2.7_

 

 

 

 

Знак плюс (+) и ноль (0)

 

('% 05.1f', e)

+02.7_

 

 

 

 

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

Если точка для %f не указана, то по умолчанию будет приведен формат %.6f (6 цифр после десятичной точки).

Если указано precision равное 0, то десятичная точка также исчезает. Для того чтобы ее вернуть, нужно после спецификатора формата %f указать ее в виде простого текста.

Можно в одном спецификаторе формата указать одновременно и ширину (width), и точность (precision). Например, 5.2 означает общую длину 5, с 2 цифрами после десятичной точки. Самая распространенная ошибка, когда считают, что это означает 5 цифр до точки и 2 цифры после точки.

Флаги позволяют управлять выравниванием выходных данных с помощью дополнительных флагов.

Ширину и точность с флагами можно комбинировать, чтобы указать левое выравнивание, дополнение слева нулями и применение знака +, - и т. д.

49

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

В табл.1.2.4-4 показаны допустимые специальные непечатные символы.

 

Таблица 1.2.4-4

 

 

Символ

Влияние на текст

 

 

''

Одиночная кавычка

 

 

%%

Одиночный знак процента

 

 

\\

Однократная обратная косая черта

 

 

\a

Аварийная сигнализация

 

 

\b

Возврат на одну позицию

 

 

\n

Новая строка

 

 

\r

Возврат каретки

 

 

\t

Горизонтальная табуляция

 

 

\v

Вертикальная табуляция

 

 

\xN

Шестнадцатеричное число, N

 

 

\N

Восьмеричное число, N

 

 

Рассмотрим несколько примеров форматирования, представленных на рис. 1.2.4-6.

-->// Примеры форматированного вывода

-->

--> // Пример1. Использование символов %s для вывода текста

--> t ='Текст';

--> mprintf('%s' ,t)

Текст

-->

--> // Пример2. Использование символов %f для вывода числа

--> x = 234.2;

--> mprintf('%6.2f', x) 234.20 -->

--> // Пример3.Вывод элементов матрицы в различных форматах

--> A = %pi * 1000 * ones(1,4) // ones(1,4) – создание матрицы из 1

A =

 

 

 

3141.5927

3141.5927

3141.5927

3141.5927

-->

 

 

 

--> mprintf('%f\n%9.2f\n%+12.5f\n%12.2f\n' ,A)

ans =

 

 

!3141.592654

!

 

!

!

 

! 3141.59

!

 

!

!

 

 

 

 

 

 

 

50