2009-04-10 17 views

Respuesta

16

Una manera:

x(x == 0) = []; 

Una nota sobre el calendario:

Como se ha mencionado por woodchips, este método parece lento en comparación con el utilizado por KitsuneYMG. Esto también lo notó Loren en uno de sus MathWorks blog posts. Como mencionó tener que hacer esto miles de veces, puede notar una diferencia, en cuyo caso primero probaría x = x(x~=0);.

ADVERTENCIA: Tenga cuidado si utiliza números no enteros. Si, por ejemplo, tiene un número muy pequeño que le gustaría considerar lo suficientemente cerca como cero para que se elimine, el código anterior no lo eliminará. Solo se borran ceros. Lo siguiente le ayudará también elimina los números "suficientemente cerca" a cero:

tolerance = 0.0001; % Choose a threshold for "close enough to zero" 
x(abs(x) <= tolerance) = []; 
+0

Esta falla en números negativos Pruebe 'abs (x) <= exceso tolerado – KitsuneYMG

+0

La tolerancia x <= excluiría los números negativos de punto flotante. Probablemente necesite expandir la comparación para que sea x> = tolerancia yx <= tolerancia. El operador de lógica y en matlab se me escapa en este momento. –

+0

Corregí la respuesta para eliminar cualquier valor lo suficientemente cerca de cero desde la dirección negativa o positiva. – gnovice

11

Sólo para ser diferente:

x=x(x~=0); 

o

x=x(abs(x)>threshold); 

Esto tiene la ventaja de trabajar en complejo números también

3

Aquí hay otra forma

y = x (find (x))

Dejo que usted se dé cuenta de la eficacia relativa de los diversos enfoques que intenta: escriba y háganos saber.

11

Esas son las tres soluciones comunes. Ayuda a ver la diferencia.

x = round(rand(1,15000)); 

y = x; 

tic,y(y==0) = [];toc 

Elapsed time is 0.004398 seconds. 

y = x; 

tic,y = y(y~=0);toc 

Elapsed time is 0.001759 seconds. 

y = x; 

tic,y = y(find(y));toc 

Elapsed time is 0.003579 seconds. 

Como debe ver, la manera más barata es el índice lógico directo, seleccionando los elementos que se conservarán. El hallazgo es más caro, ya que Matlab encuentra esos elementos, devolviendo una lista de ellos, y luego indexa en el vector.

+0

¡Guau! ¿Son esos números correctos? Podría haber jurado que "y (y == 0) = [];" y "y = y (y ~ = 0);" eran comparables entre sí velocidad-sabio. Tendré que verificar mis números nuevamente. – gnovice

+0

No importa ... Acabo de encontrar una publicación en el blog de Loren en las herramientas matemáticas que aborda exactamente este problema, y ​​parece estar de acuerdo con sus números. – gnovice

+0

@gnovice Tenga en cuenta que ahora puede usar '[~, ~, y] = find (y)' que debería proporcionar un rendimiento similar a la solución con indexación lógica. –

0
x = [0 0 0 1 1 0 5 0 7 0] 
y = [0 2 0 1 1 2 5 2 7 0] 

Entonces x2 e y2 se puede obtener como:

x2=x(~(x==0 & y==0)) 
y2=y(~(x==0 & y==0)) 

x2 = [0  1  1  0  5  0  7] 
y2 = [2  1  1  2  5  2  7] 

Espero que esto ayude!

2

Aunque mis resultados de los tiempos no son concluyentes acerca de si es significativamente más rápido, esto parece ser el enfoque más rápida y fácil:

y = nonzeros(y) 
Cuestiones relacionadas