2013-01-06 6 views
5

Qual è la differenza tra gli operatori logici | e || in MATLAB?Qual è la differenza tra | e || in MATLAB?

+1

Dai un'occhiata alla documentazione: http://www.mathworks.co.uk/help/matlab/matlab_prog/operators.html#f0-38948. –

+3

domanda correlata: [Qual è la differenza tra & e && in MATLAB?] (Http://stackoverflow.com/questions/1379415/whats-the-difference-between-and-in-matlab) –

risposta

0

|| viene utilizzato per ingressi scalari

| prende array input se/while

Dalla source: -

utilizzano sempre la & & e || operatori quando è richiesto un cortocircuito. Utilizzando gli operatori elementwise (& e |) per il cortocircuito, produce risultati imprevisti.

+1

Questo non è del tutto preciso. –

2

operatori logici

MATLAB offre tre tipi di logica operators e functions:

  • | è Element-wise - operano su elementi di matrici logiche corrispondenti.
    Esempio: ingressi vettore A e B

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

    A | B = 11101

  • || è cortocircuito - operare sui scalare, espressioni logiche

    Esempio:

    ||: Restituisce logico 1 (vero) se uno di ingresso, o di entrambi, restituiscono true, e logico 0 (falso) se non lo fanno.

    Operando: espressioni logiche contenenti valori scalari.

    A || B (B viene valutata solo se A è falso)

    A = 1; B = 0;

    C =(A || (B = 1));

    B è 0 dopo questa espressione e C is 1.

  • Altro, bit-saggio: operare sui bit corrispondenti di valori o array interi.
    reference link

0

| rappresenta OR come logical operator. è anche un operatore logico chiamato short-circuit OR

Il vantaggio più importante degli operatori di cortocircuito è che è possibile utilizzarli per valutare un'espressione solo quando sono soddisfatte determinate condizioni. Ad esempio, si desidera eseguire una funzione solo se il file di funzione risiede sul percorso MATLAB corrente. Corto circuito mantiene il seguente codice da generare un errore quando il file, myfun.m, non può essere trovato:

comp = (exist('myfun.m') == 2) && (myfun(x) >= y) 

Allo stesso modo, questa affermazione evita il tentativo di dividere per zero:

x = (b ~= 0) && (a/b > 18.5) 

Puoi anche utilizzare gli operatori && e || in if e while dichiarazioni di sfruttare loro comportamento cortocircuito:

if (nargin >= 3) && (ischar(varargin{3})) 
+0

Ripete le informazioni indicate nella domanda. –

+0

Sono su una rete maledetta su cellulare e non ho nemmeno visto che c'è un'altra risposta. Qualcuno può per favore formattare il codice nel mio post. – bonCodigo

+0

Fantastico, credo di doverlo fare da solo. Ecco un altro post che potresti voler guardare. Formatterò il post quando avrò davanti una macchina. http://stackoverflow.com/questions/1379415/whats-the-difference-between-and-in-matlab – bonCodigo

5

Sono sicuro di aver letto la documentazione per short-circuiting operators e per element-wise operators.

Una differenza importante è che gli operatori a livello di elemento possono operare sugli array mentre gli operatori di cortocircuito si applicano solo agli operandi logici scalari.

Ma probabilmente la differenza principale è il problema del cortocircuito. Per gli operatori di cortocircuito, l'espressione viene valutata da sinistra a destra e non appena il risultato finale può essere determinato con certezza, i termini rimanenti non vengono valutati.

Ad esempio, si consideri

x = a && b 

Se a viene valutato come false, allora sappiamo che a && b viene valutato come false indipendentemente da ciò che viene valutato come b. Quindi non c'è bisogno di valutare b.

Ora consideriamo questa espressione:

NeedToMakeExpensiveFunctionCall && ExpensiveFunctionCall 

dove immaginiamo che ExpensiveFunctionCall richiede molto tempo per valutare. Se possiamo eseguire un altro test a basso costo che ci consenta di saltare la chiamata a ExpensiveFunctionCall, possiamo evitare di chiamare ExpensiveFunctionCall.

Supponiamo quindi che NeedToMakeExpensiveFunctionCall valuti su false. In tal caso, poiché abbiamo utilizzato gli operatori di cortocircuito, non verrà chiamato ExpensiveFunctionCall.

Al contrario, se abbiamo usato l'operatore elemento-saggio e scritto la funzione come questa:

NeedToMakeExpensiveFunctionCall & ExpensiveFunctionCall 

poi la chiamata a ExpensiveFunctionCall non sarebbe mai saltato.

Infatti la MATLAB documentation, che spero di aver letto, include un ottimo esempio che illustra il punto molto bene:

x = (b ~= 0) && (a/b > 18.5) 

In questo caso non possiamo effettuare a/b se b è zero.Da qui il test per b ~= 0. L'uso dell'operatore di cortocircuito significa che evitiamo di calcolare a/b quando b è zero e quindi evitare l'errore di runtime che si verificherebbe. Chiaramente l'operatore logico element-element non sarebbe in grado di evitare l'errore di run-time.

Per una discussione più approfondita sulla valutazione del cortocircuito, fare riferimento a Wikipedia article sul soggetto.

+3

+1: Potrebbe essere degno di nota menzionare che '|' può operare anche sugli array, mentre '||' solo su scalari. Inoltre, [Loren Shure] (http://blogs.mathworks.com/loren/) indica [qui] (http://stackoverflow.com/a/1393606/1336150) che '|' può anche cortocircuitare (!!), ma solo nelle istruzioni 'if' /' while'. –

0

Cortocircuito || significa che i parametri verranno valutati solo se necessariamente nell'espressione. Nel nostro esempio expr1 || expr2 se valuta TRUE, non è necessario valutare il secondo operando - il risultato sarà sempre TRUE. Se hai una lunga catena di operatori di cortocircuito A || B || C || D e la tua prima valutazione è vera, gli altri non verranno valutati.

Se si sostituisce Element-wise logico | a A | B | C | D, tutti gli elementi verranno valutati indipendentemente dagli operandi precedenti.