2013-01-06 21 views
5

Jaka jest różnica między operatorami logicznymi | i || w programie MATLAB?Jaka jest różnica między | i || w MATLAB?

+1

Zapoznaj się z dokumentacją: http://www.mathworks.co.uk/help/matlab/matlab_prog/operators.html#f0-38948. –

+3

powiązane pytanie: [Jaka jest różnica między & a && w MATLAB?] (Http://stackoverflow.com/questions/1379415/whats-the-difference-between-and-in-matlab) –

Odpowiedz

0

|| 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.

+1

To nie jest całkowicie dokładne. –

2

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 wektor A i B

    A = [0 1 1 0 1]; B = [1 1 0 0 1];

    A | B = 11101

  • || jest zwarciem - działają na skalara, wyrażenia logiczne

    Przykł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 jest 0 po tym wyrażeniu i C is 1.

  • Inna jest, Bit-mądry - działają na odpowiednich bitów wartości całkowitych lub tablic.
    reference link

0

| 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})) 
+0

Powtarza informacje podane w pytaniu. –

+0

Jestem w przerażonej sieci komórkowej i nawet nie widzę innej odpowiedzi. Czy ktoś może sformatować kod w moim poście? – bonCodigo

+0

Ś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

5

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.

+3

+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'. –

0

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.

Powiązane problemy