Операторы отношения и логические операторы
Операторы отношения служат для поэлементного сравнения двух операндов, в качестве которых могут выступать числа, векторы или матрицы. При этом сравниваемые векторы или матрицы должны иметь одинаковые размеры. Если операнды одинаковы, то программа возвращает 1 (True – Истина), в противном случае–0 (False – Ложь). Перечень операторов отношения с соответствующими им функциями представлен в таблице 4.1.
Таблица 4.1. Операторы отношения и их функции
Оператор
| Название
| Функция
| ==
| Равно
| Eq
| ~=
| Не равно
| Ne
| <
| Меньше
| Lt
| >
| Больше
| Gt
| <=
| Меньше или равно
| Le
| >=
| Больше или равно
| Ge
|
Операторы = = и ~= сравнивают действительные и комплексные переменные. При этом сравниваются действительные и комплексные части числа.
Операторы <, <=, >, >= при сравнении комплексных чисел сравнивают только действительные части числа.
Примеры приведены в табл. 4.2.
Таблица 4.2. Примеры использования операторов отношения
Выражение
| Функция
| Результат
| >> 3==3
| >> eq(3,3)
| ans =
| >>5~=5
| >> ne(5,5)
| ans =
| >> 4+2i==4+i
| >> eq(4+2i,4+i)
| ans =
| >> 7.2<8.3
| >> lt(7.2,8.3)
| ans =
| >>1.4+5i<1.5+i
| >> lt(1.4+5i,1.5+i)
| ans =
| >> 3<=2.33
| >> le(3,2.33)
| ans =
|
Если при вычислениях надо формально определить, является ли переменная x комплексной, можно вызвать функцию isreal(x), возвращающую 1 если x не является комплексной и 0 в противном случае.
В выражениях, вводимых в командном окне системы MATLAB, операторы отношения могут использоваться наряду с арифметическими операторами. Рассмотрим пример вычисления выражения, содержащего операторы отношения:
>> a=1;b=-1;c=2;
>> (a>=c)+(b==a)+(c>a)
ans =
Здесь значения выражений (a >= c) и (b == a) равны 0 (Ложь), значение выражения (c > a) равно 1 (Истина). В результате переменная ans, являющаяся суммой значений этих трех выражений, оказывается равной 1.
Операции отношения имеют более низкий приоритет, чем арифметические операции. Но в этом примере переменная ans равна сумме значений трех операций отношения только потому, что эти операции заключены в круглые скобки. Если же скобки опустить, результат будет иным:
>> a>=c+b==a+c>a
ans =
При поэлементном сравнении двух массивов одинаковых размеров с помощью операторов отношения результат будет представлен в виде массива того же размера, состоящего из нулей и единиц.
Пример:
>> A=[1 0;-2 3]
A =
1 0
-2 3
>> B=[2 3;-3 2]
B =
2 3
-3 2
>> A>B
ans =
0 0
1 1
В операторах отношения допустимо сравнение массива и числа. В этом случае происходит сравнение каждого элемента массива с числом. Результатом является массив того же размера, что и исходный.
Пример:
>> A=[1 0;-2 3];b=0.5;
>> A>b
ans =
1 0
0 1
Логические операторы предназначены для выполнения поэлементных логических операций над массивами одинаковых размеров. Логические операторы и соответствующие им функции приведены в табл. 4.3.
Таблица 4.3. Логические операторы и их функции
Оператор
| Название
| Функция
| &
| Логическое И
| And
| |
| Логическое ИЛИ
| Or
| Отсутствует
| Исключающее ИЛИ
| Xor
| ~
| Логическое НЕ
| Not
|
Первые три операции являются двухоперандными (бинарными), а операция < Не > является унарной (однооперандной).
При выполнении логических операций «истинными» считаются операнды, не равные нулю, а «ложными» – операнды, равные нулю. При этом результатом операции < И > будет 1, если оба операнда не равны нулю, и 0, если хотя бы один из операндов нулевой. Операция < ИЛИ > дает 1, если хотя бы один операнд не равен нулю. Операция < исключающее ИЛИ > выдает 1 лишь тогда, когда один из операндов равен нулю, а другой не равен, в остальных случаях она выдает 0. Операция < НЕ > выдает 1, если ее единственный операнд равен нулю, и 0 в противном случае.
Примеры использования логических операторов:
>> A=[1 0;-2 3];B=[2 3;-3 2];
>> and(A,B) или >> A&B
ans =
1 0
1 1
>> or(A,B) или >> A|B
ans =
1 1
1 1
>> xor(A,B)
ans =
0 1
0 0
>> not(A) или >> ~A
ans =
0 1
0 0
Элементами логических операторов могут быть массив и число. В этом случае происходит поэлементное выполнение логической операции для каждого элемента массива и числа. Результатом является массив того же размера, что и исходный.
Пример:
>> A=[1 0;-2 3];b=3;
>> xor(A,b)
ans =
0 1
0 0
Поскольку логические и арифметические операции могут входить в одно выражение, порядок выполнения этих операций зависит от их приоритета. Выполнение операций одинакового приоритета происходит в порядке слева направо. Приоритет операций можно изменить с помощью круглых скобок.
Приоритеты операций системы MATLAB в порядке убывания приведены ниже:
1. Круглые скобки <( )>.
2. Транспонирование <.'>, транспонирование с комплексным сопряжением<'>, возведение в степень <^>, поэлементное возведение в степень <.^>.
3. Унарный плюс <+>, унарный минус <–>, логическое отрицание <~>.
4. Умножение и деление (в том числе поэлементное) <*>, </>, <\>, <.*>, <./>, <.\>.
5. Сложение <+> и вычитание <–>.
6. Операции отношения <, <=, >, >=, ==, ~=.
7. Логическое И <&>.
8. Логическое ИЛИ <|>.
Отметим, что сначала выполняются операции над аргументами функций eq, ne, lt, gt, le, ge, and, or, not, если использовать их вместо соответствующих им операторов. Например, два выражения and(A,B)+F и A&B+F не эквивалентны.
Справку можно получить с помощью команды doc ops.
Операторы цикла
Цикл for используется для повторения команды или набора команд в случае, когда число повторений заранее известно. Синтаксис цикла for имеет следующий вид:
for var = b1:b2:b3
Команды (текст программы)
End
Здесь var – переменная (счетчик) цикла, которая при каждом повторении цикла изменяется от начального значения b1 до конечного значения b3 с шагом b2 (если параметр b2 не указан, по умолчанию его значение принимается равным 1). Переменная цикла может принимать не только целые, но и вещественные значения с любым знаком. Команды в тексте программы разделяются запятой <,>, точкой с запятой <;> или нажатием клавиши <Enter>. Ввод команд завершается командой end. Цикл завершается, как только значение var превысит b3. Команды между for и end воспринимаются системой как части одной сложной команды. Поэтому нажатие клавиши <Enter> для перехода к следующей строке не приводит в данном случае к выполнению этих команд. Выполнение команд начинается только тогда, когда введена «закрывающая скобка» сложной команды в виде ключевого слова end.
Если несколько сложных команд такого типа вложены одна в другую, вычисления начинаются лишь тогда, когда записан конец (end) наиболее охватывающей (внешней) сложной команды.
Например, для поиска суммы элементов матрицы A, расположенных ниже главной диагонали, в файл-функции Sn следует использовать два цикла for, причем начальное значение счетчика внутреннего цикла зависит от текущего значения счетчика внешнего цикла:
function s=Sn(A)
[n m]=size(A);
s=0;
for j=1:m
for i=j+1:n
s=s+A(i,j);
end
end
В том случае, когда число повторений заранее неизвестно и определяется в ходе выполнения набора команд, следует организовать цикл while. Цикл while работает, пока выполнено условие цикла.
Пример файл-функции polsum, которая находит сумму всех первых положительных элементов вектора:
function s=polsum(x)
s=0;
k=1;
while x(k)>0
s=s+x(k);
k=k+1;
end
Вызовем файл-функцию polsumиз командной строки:
>> a=[1 -2 3];
>> S=polsum(a)
S =
Файл-функция polsum имеет один недостаток: если все элементы вектора – положительные числа, то k становится больше длины вектора x, что приводит к ошибке, например:
>> a=[1 2 3];
>> S=polsum(a)
??? Index exceeds matrix dimensions.
Кроме проверки значения x(k), следует позаботиться о том, чтобы значение k не превосходило длины вектора x. Вход в цикл должен осуществляться только при одновременном выполнении условий k <= length(x) и x(k) > 0, т. е. необходимо применить логический оператор < И >, обозначаемый в MATLAB символом &. Заменим в файл-функции polsum условие цикла while x(k)>0 на составное while k <= length(x)&x(k) > 0. Если первое из условий не выполняется, то второе условие проверяться не будет, именно поэтому выбран такой порядок операндов. Теперь файл-функция polsum будет работать верно для любых векторов:
>> a=[1 2 3];
>> S=polsum(a)
S =
Операторы ветвления
Ветвление в ходе работы программы осуществляется при помощи конструкции if-elseif-else. Самый простой вариант ее использования (без elseif и else) реализован в файл-функции possum , которая предназначена для нахождения суммы всех элементов вектора, больших 2:
function s=possum2(x)
s=0;
for k=1:length(x)
if x(k)>2
s=s+x(k);
end
end
Если ход программы должен изменяться в зависимости от нескольких условий, то следует использовать полную конструкцию if-elseif-else. Каждая из ветвей elseifв этом случае должна содержать условие выполнения набора команд, размещенных после нее. Важно понимать, что условия проверяются подряд, первое выполненное условие приводит к работе соответствующего набора, выходу из конструкции if-elseif-else и переходу к команде, следующей за end. У последней ветви else не должно быть никакого условия. Команды, находящиеся между elseи end, выполняются в том случае, если все условия оказались невыполненными.
Предположим, что требуется написать файл-функцию для вычисления кусочно-заданной функции:
f(x)=
Она имеем вид
function f=pwf(x)
if x<-1
f=-abs(x)^(1/3);
elseif x<=3
f=x;
else
f=2-x;
end
Первое условие x < -1 проверяется в ветви if. Отметим, что условие –1 ≤ x не требуется включать в следующую ветвь elseif , поскольку в эту ветвь программа заходит, если предыдущее условие (x < -1) не выполнено. Условие x > 3 также проверять не надо. Если не выполнены два предыдущих условия x < -1 и x ≤ 3, то x будет больше трех.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|