2011-03-01 47 views
5

En Matlab, supongamos que hay un vector cuyos elementos pueden ser complejos o reales. Me preguntaba cómo eliminar los elementos no reales y, en consecuencia, reducir el tamaño del vector. ¡Gracias y saludos!cómo eliminar el número complejo en un vector en Matlab

+0

posible duplicado de [extraer el número real de la matriz en matlab] (http://stackoverflow.com/questions/13859760/extract-real-number-from-array-in-matlab) – Shai

Respuesta

11

Uso los REAL y IMAG funciones:

 
>> x = [1+i; 4+3i; 5+6i] 

x = 

          1 +      1i 
          4 +      3i 
          5 +      6i 

>> real(x) 

ans = 

    1 
    4 
    5 

>> imag(x) 

ans = 

    1 
    3 
    6 

EDIT

Lo anterior no responde a la pregunta del cartel. Esto hace.

Utilice los FINDREAL y funciones:

 
>> v = [1+i; 2; 3] 

v = 

          1 +      1i 
          2       
          3       

>> v(v == real(v)) 

ans = 

    2 
    3 
+0

¡Gracias! Pero me gustaría sacar esos números no reales del vector, no reemplazarlos con sus partes reales. – Tim

+0

@Tim - Edité mi respuesta para reflejar su comentario. –

+0

¡Gracias! Pero aún no es lo que pedí. Por ejemplo, v = [1 + i, 2, 3], me gustaría que v se convierta en [2,3], no [1,2,3] ni [1,0,0]. – Tim

1

Eso es una cosa muy inusual para preguntar. Como la parte imaginaria es un número de punto flotante, no se puede decir realmente qué número es un número real y qué número está muy cerca de un número real. Tal función no existe en Matlab ya que no está muy claro cómo sería útil para nada (no tiene mucho sentido eliminar esos números). Especificar su propósito real aquí podría ayudarlo a obtener mejores respuestas.

Si desea asegurarse de que sólo los números reales se dejan en el vector, puede utilizar el siguiente (no funciona con matrices y filas verticales, pero tienes la idea):

x = [1, 2, 3+1i, 4+2i, 5+3i, 6, 7, 8+4i, 9+0i] 
z = [] 
for k = [1:length(x)] 
    if imag(x(k)) == 0 
     z = [z, real(x(k))] 
    endif 
endfor 

Si usted quiere guardar todos los números que están cerca de un número real, pero podría tener alguna pequeña parte imaginaria no nula, puede utilizar el siguiente:

x = [1, 2, 3+1i, 4+2i, 5+3i, 6, 7, 8+4i, 9+0.000001i] 
z = [] 
for k = [1:length(x)] 
    if abs(imag(x(k))) < 0.00001 
     z = [z, real(x(k))] 
    endif 
endfor 

Por supuesto, si usted nos dice lo que su el criterio real es que sería mucho más fácil darle una mejor idea. ¿Estás buscando soluciones reales para algún tipo de ecuación o sistema de ecuaciones, raíces reales de un polinomio? En este caso, el primero puede perder una solución real debido al error de aproximación, y el segundo puede darle cosas que no son soluciones.

4

También puede evitar los ensayos en un bucle utilizando la sintaxis del vector de Matlab:

x = [1, 2, 3+1i, 4+2i, 5+3i, 6, 7, 8+4i, 9+0.000001i] 
y = x(imag(x) == 0); 
z = real(x(abs(imag(x)) < 0.00001)); 

y debería ser [1,2,6,7] y z debe ser [1,2,6,7,9]

imag(x) == 0 produce un vector logical con true valores siempre que la condición se cumple la igualdad . x(<logical vector>) produce un nuevo vector con solo los elementos de x donde <logical vector> era true.

Cuestiones relacionadas