2010-03-14 32 views
7

¿Puede alguien decirme si hay una forma (en MATLAB) de verificar si un cierto valor es igual a cualquiera de los valores almacenados en otra matriz?Encontrar si un valor es igual al valor de cualquier elemento de matriz en MATLAB

La manera en que intento usarlo es comprobar si un índice de elementos en una matriz es igual a los valores almacenados en otra matriz (donde los valores almacenados son los índices de los elementos que cumplen ciertos criterios).

lo tanto, si los índices de los elementos que cumplen los criterios se almacenan en la matriz siguiente:

criteriacheck = [3 5 6 8 20]; 

Yendo a través de la matriz principal (llamado array) y comprobando si los partidos índice:

for i = 1:numel(array) 
    if i == 'Any value stored in criteriacheck' 
    %# "Do this" 
    end 
end 

¿Alguien tiene una idea de cómo podría hacer esto?

Respuesta

3

podría utilizar el comando find

if (~isempty(find(criteriacheck == i))) 
    % do something 
end 
19

La excelente answer previously given by @woodchips se aplica aquí también:

muchas maneras de hacer esto. ismember es lo primero que viene a la mente, ya que es una acción de membresía establecida que desea tomar. Por lo tanto,

X = primes(20); 
ismember([15 17],X) 
ans = 
     0 1 

Desde 15 no es primordial, pero 17 es, ismember ha hecho bien su trabajo aquí.

Por supuesto, encontrar (o cualquiera) también funcionará. Pero estos no están vectorizados en el sentido en que lo era el miembro. Podemos probar para ver si 15 está en el conjunto representado por X, pero para probar ambos números se tomará un ciclo, o pruebas sucesivas.

~isempty(find(X == 15)) 
~isempty(find(X == 17)) 

o,

any(X == 15) 
any(X == 17) 

Por último, me gustaría señalar que las pruebas para valores exactos son peligrosos si los números pueden ser verdaderos flotadores. Las pruebas contra los valores enteros que he mostrado son fáciles. Pero las pruebas contra los números de coma flotante generalmente deben emplear una tolerancia.

tol = 10*eps; 
any(abs(X - 3.1415926535897932384) <= tol) 
3

Nota: Aunque esta respuesta no aborda la cuestión en el título, sí aborda una cuestión más fundamental con la forma en que está diseñando su bucle (la solución de los cuales niega tener que hacer lo que se preguntando en el título). ;)

Basado en el bucle for que has escrito, la matriz criteriacheck parece ser un conjunto de índices en array, y para cada uno de estos elementos indexados que quieren hacer algún cálculo. Si esto es así, esto es una forma alternativa para que usted pueda diseñar su ciclo for:

for i = criteriacheck 
    %# Do something with array(i) 
end 

Este bucle voluntad sobre todos los valores de criteriacheck, el establecimiento de i a cada valor subsiguiente (es decir, 3, 5, 6, 8, y 20 en tu ejemplo). Esto es más compacto y eficiente que recorrer cada elemento de array y verificar si el índice está en criteriacheck.

NOTA: Como señala Jonas, debe asegurarse de que criteriacheck sea un vector de fila para que el bucle for funcione correctamente. Puede formarse una matriz en un vector fila, siguiendo con la sintaxis (:)', que reshapes it into a column vector y luego transposes it a un vector fila:

for i = criteriacheck(:)' 
... 
+1

Tenga en cuenta que la verificación de criterios debe ser un vector de fila, es decir [3,5,6 ...], en lugar de [3; 5; 6 ...]. Para estar seguro, escribiría << para i = criteriacheck (:) '>>. En cualquier caso, +1 – Jonas

+0

@Jonas: Buena idea, solo para estar seguro. ;) – gnovice

1

La pregunta original "¿Puede alguien decirme si hay una manera (en MATLAB) para verificar si un cierto valor es igual a cualquiera de los valores almacenados dentro de otra matriz? " puede ser resuelto sin ningún bucle

Simplemente use la función setdiff.

0

Creo que la función INTERSECT es lo que estás buscando.

C = intersect (A, B) devuelve los valores comunes a A y B. Los valores de de C están ordenados.

http://www.mathworks.de/de/help/matlab/ref/intersect.html

La pregunta if i == 'Any value stored in criteriacheck también se puede responder de esta manera si se tiene en cuenta i una matriz trivial. Sin embargo, está en una mejor posición con any(i==criteriacheck)

Cuestiones relacionadas