Jaka jest różnica między operatorami logicznymi |
i ||
w programie MATLAB?Jaka jest różnica między | i || w MATLAB?
Odpowiedz
||
służy do wejść skalarnych
|
trwa array wejście, jeśli/gdy sprawozdanie
Z source: -
Zawsze używaj & & i || operatorzy, gdy wymagane jest zwarcie. Użycie operatorów elementowych (& i |) do zwarcia może spowodować, że przyniesie nieoczekiwane wyniki.
To nie jest całkowicie dokładne. –
Logika Operatorzy
MATLAB oferuje trzy rodzaje logicznego operators
i functions
:
|
Element jest mądry - działają na odpowiednie elementy tablic logicznych.
przykład: wejścia wektorA
iB
A = [0 1 1 0 1]; B = [1 1 0 0 1];
A | B = 11101
||
jest zwarciem - działają na skalara, wyrażenia logicznePrzykład:
||
: Zwraca logiczny 1 (prawda), jeśli zarówno wejście, albo jedno i drugie, ocenia się prawdą, a logiczne 0 (fałsz), jeśli nie.Operand: wyrażeń logicznych zawierających wartości skalarne.
A
||B
(B oceniany tylko jeśli A jest fałszem)A = 1;
B = 0;
C =(A || (B = 1));
B
jest0
po tym wyrażeniu iC is 1
.Inna jest, Bit-mądry - działają na odpowiednich bitów wartości całkowitych lub tablic.
reference link
|
oznacza OR
jako logical operator.||
to także operator logiczny o nazwie short-circuit OR
Najważniejszą zaletą operatorów zwarć jest to, że można ich używać do oceny wyrażenia tylko wtedy, gdy spełnione są określone warunki. Na przykład chcesz wykonać funkcję tylko wtedy, gdy plik funkcji znajduje się na bieżącej ścieżce MATLAB. Zwarcie utrzymuje następujący kod wygeneruje błąd, gdy plik, myfun.m, nie można znaleźć:
comp = (exist('myfun.m') == 2) && (myfun(x) >= y)
Podobnie, stwierdzenie to unika próby dzielenia przez zero:
x = (b ~= 0) && (a/b > 18.5)
Ty możliwe, również użyć operatorów &&
i ||
w if
i while
sprawozdania do skorzystania z ich zwarciowego zachowania:
if (nargin >= 3) && (ischar(varargin{3}))
Powtarza informacje podane w pytaniu. –
Jestem w przerażonej sieci komórkowej i nawet nie widzę innej odpowiedzi. Czy ktoś może sformatować kod w moim poście? – bonCodigo
Świetnie, myślę, że muszę to zrobić na własną rękę. Oto kolejny wpis, na który możesz spojrzeć. Sformalizuję wpis, gdy znajdę się przed maszyną. http://stackoverflow.com/questions/1379415/whats-the-difference-between-and-in-matlab – bonCodigo
Na pewno przeczytałeś dokumentację dla short-circuiting operators i dla element-wise operators.
Jedną z istotnych różnic jest to, że operatory elementarne mogą działać na tablicach, podczas gdy operatory zwarcia mają zastosowanie tylko do skalarnych argumentów logicznych.
Ale prawdopodobnie najważniejszą różnicą jest problem zwarcia. W przypadku operatorów zwarciowych wyrażenie jest oceniane od lewej do prawej, a gdy tylko można na pewno określić wynik końcowy, pozostałe warunki nie są oceniane.
Na przykład, rozważmy
x = a && b
Jeśli a
ocenia się false
, to wiemy, że a && b
ocenia się false
niezależnie od tego, co b
ocenia się. Nie ma więc potrzeby oceny b
.
Teraz rozważmy to wyrażenie:
NeedToMakeExpensiveFunctionCall && ExpensiveFunctionCall
gdzie możemy sobie wyobrazić, że ExpensiveFunctionCall
zajmuje dużo czasu na ocenę. Jeśli możemy wykonać inny, tani test, który pozwoli nam pominąć wywołanie ExpensiveFunctionCall
, możemy uniknąć wywołania ExpensiveFunctionCall.
Załóżmy, że NeedToMakeExpensiveFunctionCall
ma wartość false
. W takim przypadku, ponieważ użyliśmy operatorów zwarciowych, ExpensiveFunctionCall
nie zostanie wywołane.
Natomiast jeśli użyliśmy operatora element mądry napisał funkcję tak:
NeedToMakeExpensiveFunctionCall & ExpensiveFunctionCall
potem nigdy nie zostanie pominięty wywołanie ExpensiveFunctionCall
.
W rzeczywistości MATLAB documentation, które mam nadzieję, że przeczytał, zawiera doskonały przykład, który ilustruje punkt bardzo dobrze:
x = (b ~= 0) && (a/b > 18.5)
W tym przypadku nie możemy wykonać a/b
jeśli b
wynosi zero.Stąd test na b ~= 0
. Użycie operatora powodującego zwarcie oznacza, że unikamy obliczania wartości a/b
, gdy b
wynosi zero, a więc unikniemy błędu, który wystąpiłby w czasie działania. Najwyraźniej logiczny operator logiczny nie byłby w stanie uniknąć błędu czasu wykonania.
Aby uzyskać więcej informacji na temat oceny zwarć, zapoznaj się z Wikipedia article na ten temat.
+1: Warto wspomnieć, że '|' może działać również na tablicach, a '||' tylko na skalarach. Co więcej, [Loren Shure] (http://blogs.mathworks.com/loren/) zwraca uwagę [tutaj] (http://stackoverflow.com/a/1393606/1336150), że '|' może również powodować zwarcie (!!), ale tylko w instrukcjach 'if' /' while'. –
Zwarcie ||
oznacza, że parametry będą oceniane tylko jeśli koniecznie w wyrażeniu. W naszym przykładzie expr1 || expr2
jeśli expr1
ocenia się na TRUE
, wówczas nie ma potrzeby oceniania drugiego argumentu - wynik zawsze będzie wynosił TRUE
. Jeśli masz długi łańcuch operatorów zwarciowych A || B || C || D
, a twój pierwszy jest prawdziwy, to inni nie będą oceniani.
Jeśli zamienisz logicznie elementycznie na logiczny |
na A | B | C | D
, wszystkie elementy zostaną ocenione niezależnie od poprzednich argumentów.
Zapoznaj się z dokumentacją: http://www.mathworks.co.uk/help/matlab/matlab_prog/operators.html#f0-38948. –
powiązane pytanie: [Jaka jest różnica między & a && w MATLAB?] (Http://stackoverflow.com/questions/1379415/whats-the-difference-between-and-in-matlab) –