2010-05-20 33 views
12

¿Qué es el "modo MATLAB" para comprobar si un vector solo contiene ceros, por lo que se evaluará a un escalar en lugar de a un vector. Si me quedo este código:¿Cómo comprobar en MATLAB si un vector solo contiene ceros?

vector = zeros(1,10) 

%the "1" represents a function that returns a scalar 
if 1 && vector == 0 %this comparision won't work 
    'success' 
end 

me sale el error:

??? Operands to the || and && operators must be convertible to logical scalar values.

+0

El error que está recibiendo es porque usted está utilizando el '&&' operador entre un escalar y una vector. Para comparar vectores de igual tamaño, use el operador '&' para obtener una matriz lógica. De lo contrario, debe usar otra función como 'any' o' all' para reducir su vector a un solo escalar. – Doresoom

Respuesta

21

Uso all:

vector = zeros(1,10) 
if 1 && all(vector == 0) %this comparision will work 
    'success' 
end 
+1

¡Perfecto! Eso fue rápido. – Lucas

+0

Cabe señalar que no necesita el '1 &&'. No sirve para nada. – gnovice

+0

@gnovice: en realidad no tengo '1' aquí, pero una función que devuelve un escalar. – Lucas

14

Desde ceros son tratados de la misma manera que false, no es necesario para usar vector == 0, como ptomato sugiere. ~any(vector) es el "modo MATLAB" para verificar solo valores cero.

if 1 && ~any(vector) 
    'success' 
end 

Extender el problema a las matrices, que tendría que utilizar

array = zeros(5); 
if 1 && ~any(array(:)) 
    'success' 
end 
+0

Esto también es limpio. ¡Gracias! – Lucas

1

Usted puede encontrar fácilmente en su caso y el número de entradas en vector contienen elementos distintos de cero utilizando la siguiente:

vector = zeros(1, 10); 
nrNonZero = sum(vector~=0) 

vector~=0 devuelve una matriz de las mismas dimensiones que vector que contiene ceros y unas, que representan verdadero y falso, para la instrucción dada. La variable nrNonZero contiene la cantidad de elementos distintos de cero en vector.

Por lo tanto, el código sería entonces

if (sum(vector~=0) == 0) 
    'success' 
end 
0

También lo puede hacer uso de este:

if(boolFunCall() & ~vector) 
    disp('True'); 
else 
    disp('False'); 
end 

Así como declaró Doresoom, el problema está en el uso de && en lugar de &. Además, el ~ invierte todos los 1 y 0 con lo que un vector cero en un vector de 1s:

test = [0 0 0 0 0 0]; 
~test 
ans = 

    1  1  1  1  1  1  1 
test = [1 0 0 1 0 1 0 0 0]; 
~test 
ans = 

    0  1  1  0  1  0  1  1  1 
Cuestiones relacionadas