¿Cuál es la diferencia entre & y && en MATLAB?

Respuestas:

93

El & es el operador lógico AND. El doble ampersand && es de nuevo un operador lógico AND que emplea un comportamiento de cortocircuito. El cortocircuito solo significa que el segundo operando (lado derecho) se evalúa solo cuando el resultado no está completamente determinado por el primer operando (lado izquierdo)

A y B (se evalúan A y B)

A && B (B solo se evalúa si A es verdadera)

Fraser
fuente
75
Advertencia: &puede operar en matrices pero &&solo puede operar en escalares.
gnovice
Nota al margen: después de 15 años trabajando con Matlab casi a diario siempre uso '&' y nunca me ha mordido el trasero. OTOH, conozco a muchas personas que se molestan al usar '&&' porque tienen que recordar que no es universal (sí, me doy cuenta de que '&' no es tan eficiente porque no hace cortocircuitos, pero yo casi nunca margarita- encadenar mis operandos para que los ahorros hoy en día sean insignificantes).
Eric
7
@neuronet no se trata realmente de eficiencia, más que permite una construcción donde la primera expresión garantiza una condición sin la cual la segunda expresión puede causar un error en tiempo de ejecución. ej. d != 0 && 1/dvs d !=0 & 1/d- el primero no garantiza la división por cero, el segundo no.
Fraser
2
Esta respuesta es incompleta e inexacta. &hace cortocircuito si en una ifdeclaración. Y &&toma entradas escalares. La respuesta de @ Loren a continuación es correcta.
Cris Luengo
2
También tenga en cuenta que Loren es un empleado de MathWorks. Una respuesta no tiene más autoridad que esa. Si está dispuesto a hacer un sacrificio, puede marcar su respuesta para que un mod lo elimine (no puede eliminarlo usted mismo, porque está aceptado). Conservaría la reputación que obtuvo de él (si entiendo el sistema correctamente), y terminaríamos con una respuesta superior técnicamente correcta y autorizada.
Andras Deak
35

&&y ||tomar entradas escalares y cortocircuito siempre. |y &tomar entradas de matriz y cortocircuito solo en declaraciones if / while. Para la asignación, estos últimos no cortocircuitan.

Consulte estas páginas de documentos para obtener más información.

Loren
fuente
1
¿Tiene alguna información sobre qué versiones de Matlab atajos &y |en declaraciones if / while? No parece ser el caso en R2012b y R2014a.
Tim
@Loren alguna idea de por qué diseñaron uno para trabajar solo con escalares? Parece extraño ...
Eric
@neuronet: No puede cortocircuitarse si opera en matrices.
Cris Luengo
17

Como ya han mencionado otros, &es un operador AND lógico y &&es un operador AND de cortocircuito . Se diferencian en cómo se evalúan los operandos y en si operan o no en matrices o escalares:

  • &(Operador Y) y |(Operador O) pueden operar en matrices de una manera por elementos.
  • &&y ||son versiones de cortocircuito para las que el segundo operando se evalúa solo cuando el resultado no está completamente determinado por el primer operando. Estos solo pueden operar en escalares , no en matrices.
gnovice
fuente
8

Ambos son operaciones AND lógicas. Sin embargo, && es un operador de "cortocircuito". De los documentos de MATLAB:

Son operadores de cortocircuito en el sentido de que evalúan su segundo operando solo cuando el resultado no está completamente determinado por el primer operando.

Vea más aquí .

marca
fuente
6

Similar a otros lenguajes, &es un operador lógico bit a bit, mientras que &&es una operación lógica.

Por ejemplo (perdón por mi sintaxis).

Si..

A = [True True False True]
B = False
A & B = [False False False False]

..o..

B = True
A & B = [True True False True]

Para &&, el operando derecho solo se calcula si el operando izquierdo es verdadero y el resultado es un único valor booleano.

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

Espero que esté claro.

Erik Kerber
fuente
3
No es bit a bit, es a elemento.
Cris Luengo
3
¿Me recuperé realmente 10 años después? 😺
Erik Kerber
Bueno, esta pregunta ha recibido ~ 115.000 visitas hasta ahora, lo que significa que mucha gente ha leído información errónea aquí. Muchas de estas respuestas están incompletas o contienen información incorrecta. Todo lo que necesita hacer es corregir su respuesta o eliminarla. Por cierto: bitandes el operador AND lógico bit a bit en MATLAB.
Cris Luengo
2

Una buena regla general al construir argumentos para usar en declaraciones condicionales (SI, MIENTRAS, etc.) es usar siempre && / || formularios, a menos que haya una muy buena razón para no hacerlo. Hay dos razones ...

  1. Como han mencionado otros, el comportamiento de cortocircuito de && / || es similar a la mayoría de los lenguajes similares a C. Esa similitud / familiaridad generalmente se considera un punto a su favor.
  2. Utilizando && o || formularios le obliga a escribir el código completo para decidir su intención de argumentos vectoriales. Cuando a = [1 0 0 1] y b = [0 1 0 1], ¿a & b es verdadero o falso? No puedo recordar las reglas de MATLAB's &, ¿tú? La mayoría de la gente no puede. Por otro lado, si usa && o ||, está FORZADO a escribir el código "completo" para resolver la condición.

Hacer esto, en lugar de depender de la resolución de vectores de MATLAB en & y |, conduce a un código que es un poco más detallado, pero MUCHO más seguro y fácil de mantener.

Bob Gilmore
fuente
1
+1, pero debe tenerse en cuenta que su respuesta solo se aplica a los casos en los que desea que el resultado final de la operación sea escalar. Hay muchos usos para & y | donde && y || son inútiles porque no pueden devolver matrices, por ejemplo, cuando se realiza una indexación elegante como "seleccionar todo r entre 1 y 2: r((r<2)&(r<2))".
Jonas Heidelberg
Buen punto, Jonas. Estaba pensando en condicionales, no en "indexación lógica" (el término de MATLAB para la "indexación elegante" que mencionaste) cuando escribí esto. Cambié la primera oración de mi publicación para reflejar eso. ¡Gracias por el recordatorio!
Bob Gilmore