Hemos realizado una serie de operaciones (incluyendo divisiones) y tenemos el resultado en la matriz M.
¿Cuál de las siguientes expresiones nos devolverá 1 si M sólo contiene resultados válidos?
all( all( ! isinf(M) ) )
all( finite(M) )
any( all( finite(M) ) )
all( all( finite( M ) ) )
Es incorecta, ya que isinf() sólo pondrá a 1 los elementos infinitos (Inf o -Inf) pero no detectará los elementos NaN, que pueden aparecer al hacer 0/0.
Es incorrecta, en el caso generar, como finite() opera por columnas, esta expresión nos devolverá un vector fila, con tantos elementos como columnas tenga M. Sólo será un expresión valida en el caso en que M sea un vector (fila o columna).
Es incorrecta, ya que, aunque finite() devuelve la matriz con los 1s donde los elementos son finitos, al aplicar any(), bastará con que haya una columna con todos (all()) los elementos finitos, aunque en otras columnas haya algún elemento no finito (infinito, NaN o NA).
Es correcta, ya que finite() devuelve una matriz con 1s donde los números son finitos (ni Infinitos ni NaN ni NA). Aplicando all() dos veces se hace la y-lógica en toda la matriz de 0s y 1s que devuelve finite(), con lo que devolverá 1 sólo si todos los elementos son verdad.
Pregunta de Selección Múltiple
Dada una matriz M queremos obtener un vector val con elementos cuyo valor está entre 20 y 40
val = M( M>=20 , M<=40 )
Correcto
Incorrecto
val = M( (M>=20) & (M<=40) )
Correcto
Incorrecto
[i,j,val] = find((M>=20) & (M<=40))
Correcto
Incorrecto
val = M( find((M>=20) & (M<=40)) )
Correcto
Incorrecto
[i,j] = find((M>=20) & (M<=40)); M(i,j)
Correcto
Incorrecto
Comentando cada una de las opciones propuesta:
Es incorrecta y generará un error, ya que se está haciendo una indexación con una MATRIZ de 0s y 1s para las filas y otra similar para las columnas. Estas indexaciones tienen más elementos que el número de filas y columnas, respectivamente.
Es correcta, ya que se está haciendo una indexación como vector de M. El argumento es una matriz de 0s y 1s que contendrá un 1 en los elementos que cumplen las dos condiciones (ser mayor o igual que 20 y ser menor o igual que 40). Se seleccionarán y devolverán los elementos que buscamos.
Es incorrecta, ya que, aunque find devuelve como tercer parámetro de salida los elementos que son verdad, el argumento del find es una matriz de 0s y 1s, por lo que val tendrá todos los elementos a 1 y no el valor de los elementos originales en M.
Es correcta. find devuelve el índice de los elementos de su argumento que son verdad, serán los índices de los elementos de M que son mayor o igual que 20 y ser menor o igual que 40. Esos índices, devueltos por find, son utilizados para indexar M (como vector) y por lo tanto nos devolverá los elementos buscados. Es una opción más larga que la 2 pero algo más clara.
Es incorrecta. Aunque esta forma de invocar find efectivamente devuelve en i y j los índices de las filas y columnas de los elementos que son verdad, no se pueden utilizar para indexar directamente filas y columnas porque, por ejemplo, en i puede aparecer el número de una fila varias veces. Además nos devolverá una matriz y no un vector.
Reflexión
Dada una matriz M queremos saber CUANTOS elementos tienen un valor entre 20 y 40.
Qué expresión nos podría devolver ese valor.
Para obtener este número hay varias opciones. Las más directas son:
Vimos en la activiada anterior como sacar un vector con los elementos que cumplen dicha condición. Bastará con ver la longitud de dicho vector length( M( find((M>=20) & (M<=40)) ) )
Como no necesitamos los elementos, bastará con ver la longitud de lo devuelto por find(): length( find((M>=20) & (M<=40)) )
Otra alternativa es obtener la matriz de 0s y 1s de los elementos que cumplan la condición y sumar los 1s: sum( sum( (M>=20) & (M<=40) ) )
Por supuesto que puedes haber pensado en otra alternativa, más evidente para ti. Pero asegúrate de que es válida probando con varias matrices M distintas (mejor si son generadas aleatoriamente M=round(rand(10,5)*50) ).