Matlab - Duda lectura linea

 
Vista:

Duda lectura linea

Publicado por David (18 intervenciones) el 20/04/2011 18:27:38
Hola a ver si alguien podría echarme una mano con una duda:

Comp 1: (4.783920E-02,-6.800713E-03)

Tengo una linea como la que se muestra anteriormente en un archivo y quiero leer los numeros entre parentesis por separado, ya que el numero antes de la coma es la parte real y lo de despues de la coma es la parte imaginaria. ¿Como podría hacerlo?

Hasta ahora lo que tengo es:

fid=fopen(archivo, 'rt')
compimag=textscan(fid, '%*s %*s %s *[]^\n')

Tengo que poner el parentesis como un %s porque sino me devuelve error.

Si alguien tuviera alguna solución se lo agradecería.

Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Duda lectura linea

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 20/04/2011 21:28:12
Hola David.

Con respecto a tu pregunta anterior, me parece que tienes mas de una linea, por lo tanto he hecho el programa en forma general. Primeramente he creado un archivo de texto llamado dudalinea1.txt y en este archivo tengo una cantidad de datos, como tu pones en el foro. Luego creo el programa en matlab llamado dudalinea1.m. Estoy asumiendo que tus datos son de la forma que presentas en el foro, osea de varias filas, pero con un solo par de numeros y 2 parentesis , caso contrario el programa no va a funcionar.
Bueno aqui te mando el programa. Cada linea te he puesto la explicacion de que hace el programa, para mayor comprension.

%==============================================
clear, % borra variables de la memoria de matlab
a=importdata('dudalinea1.txt'); % importa datos desde dudalineal1.txt
[n,m]=size(a); % size detecta el tamaño de la celda a
for i=1:n % for desde desde 1 hasta n
i1=find(a{i}=='('); %ubica la posicion del paréntesis inicial
f1=find(a{i}==')'); %ubica la posicion del paréntesis final
d=a{i}(i1+1:f1-1); %guarda en d los elementos dentro del parentesis
i2=find(d==','); %ubica la posicion del coma dentro del parentesis
c=d(1:i2-1); % guarda en c los elementos de d antes de la coma
e=d(i2+1:end); % guarda en e los elementos de d despues de la coma
C(i,1)=str2num(c); % convierte la cadena c en un numero
C(i,2)=str2num(e); % convierte la cadena e en un numero
end % fin del bucle for
format long e % para visualizar en formato deseado
display(C); % visualiza la matriz C tipo float
% Con esta matriz C puedes hacer la operacion deseada.
%===============================================

el archivo de texto que he utilizado es este. Tiene el nombre de dudalinea1.txt


Comp 1: (4.7839245450E-02,-6.800713E-03)
Comp 2: (6.78543920E-02,-10.80073554553E-03)
Comp 3: (6.7886770E-02,-23.80346556-03)
Comp 4:(9.419303118916224E-001,4.163703835002012E-001)
Comp 5:( 9.446708074760608E-001,9.549963799777733E-001)
Comp 6:( 8.557303481430320E-001,4.163703835002012E-001)
Comp 7:( 9.538850932525661E-001,9.419303118916224E-001)
Comp 8:( 9.302087725869406E-001,9.549963799777733E-001)
Comp 9:(9.290638006039620E-001,4.163703835002012E-001)
Comp 10:(9.386919134468965E-001,9.549963799777733E-008)
Comp 11:(9.549963799777733E-007,8.905637491429781E-001)
Comp 12:(9.282307069085058E-001,9.538850932525661E-001)
Comp 13:(9.197310445267214E-001,9.549963799777733E-001)
Comp 14:(9.104997572428034E-001,8.905637491429781E-001)
Comp 15:(9.722581840259797E-009,9.419303118916224E-005)
Comp 16:(9.267514055624307E-001,9.538850932525661E-001)
Comp 17:(8.905637491429781E-004,8.557303481430320E-001)
Comp 18:(4.163703835002012E-001,8.905637491429781E-001)
Comp 19:(8.853471124641476E-001,9.419303118916224E-001)


Ambos archivos deben de estar en el directorio de trabajo de Matlab, para que se puedan ejecutar correctamente.
Te mando la ejecucion:

>> dudalinea1
C =
4.783924545000000e-002 -6.800713000000000e-003
6.785439200000000e-002 -1.080073554553000e-002
6.788677000000000e-002 -2.680346556000000e+001
9.419303118916224e-001 4.163703835002012e-001
9.446708074760608e-001 9.549963799777733e-001
8.557303481430320e-001 4.163703835002012e-001
9.538850932525661e-001 9.419303118916224e-001
9.302087725869406e-001 9.549963799777733e-001
9.290638006039620e-001 4.163703835002012e-001
9.386919134468965e-001 9.549963799777733e-008
9.549963799777734e-007 8.905637491429781e-001
9.282307069085058e-001 9.538850932525661e-001
9.197310445267214e-001 9.549963799777733e-001
9.104997572428034e-001 8.905637491429781e-001
9.722581840259796e-009 9.419303118916224e-005
9.267514055624307e-001 9.538850932525661e-001
8.905637491429782e-004 8.557303481430320e-001
4.163703835002012e-001 8.905637491429781e-001
8.853471124641476e-001 9.419303118916224e-001


Esta matriz C de n filas por 2 columnas ya es de tipo float, por lo tanto ya puedes hacer las operaciones que deseas. La Primera columna es la parte real y la segunda columna es la parte imaginaria.


Saludos.
JOSE JEREMIAS CABALLERO
ASESOR DE PROYECTOS CON MATLAB
PROFESOR DE METODOS NUMERICOS CON MATLAB
PROGRAMADOR EN MATLAB
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Duda lectura linea

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 20/04/2011 22:46:39
Hola David.
Optimizé el programa anterior que hice.

%=========================================
clear
a=importdata('dudalinea1.txt');
[n,m]=size(a);
for i=1:n
p=find(a{i}=='(' | a{i}==',' | a{i}==')');
C(i,:)=[str2num( a{i}(p(1)+1:p(2)-1)), str2num(a{i}(p(2)+1:p(3)-1))];
end
format long e
display(C);
%===========================================

%EJECUCION DEL PROGRAMA ANTERIOR OPTIMIZADO
>> dudalinea2
C =
4.783924545000000e-002 -6.800713000000000e-003
6.785439200000000e-002 -1.080073554553000e-002
6.788677000000000e-002 -2.680346556000000e+001
9.419303118916224e-001 4.163703835002012e-001
9.446708074760608e-001 9.549963799777733e-001
8.557303481430320e-001 4.163703835002012e-001
9.538850932525661e-001 9.419303118916224e-001
9.302087725869406e-001 9.549963799777733e-001
9.290638006039620e-001 4.163703835002012e-001
9.386919134468965e-001 9.549963799777733e-008
9.549963799777734e-007 8.905637491429781e-001
9.282307069085058e-001 9.538850932525661e-001
9.197310445267214e-001 9.549963799777733e-001
9.104997572428034e-001 8.905637491429781e-001
9.722581840259796e-009 9.419303118916224e-005
9.267514055624307e-001 9.538850932525661e-001
8.905637491429782e-004 8.557303481430320e-001
4.163703835002012e-001 8.905637491429781e-001
8.853471124641476e-001 9.419303118916224e-001



Saludos.
JOSE JEREMIAS CABALLERO
ASESOR DE PROYECTOS CON MATLAB
PROFESOR DE METODOS NUMERICOS CON MATLAB
PROGRAMADOR EN MATLAB
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda lectura linea

Publicado por David (18 intervenciones) el 21/04/2011 21:04:20
La verdad es que el archivo que tengo es muy largo con muchos tipos de datos:

Hay cientos de lineas cada una de dimensiones diferentes con letras y digitos. Ya he creado un programa que me elimina todo menos lo que está entre parentesis. Es decir, ya parto de la idea que lo tengo en un cell array y tengo que conseguir quedarme con los dos numeros que hay en el parentesis.

No se me ocurre ninguna idea para conseguir los números despues de hacer el textscan.

Lo he intentado cogiendo y adaptando la parte del find que me habías puesto pero no lo consigo. El programa funciona perfectamente pero tendría que crear un archivo solo con esas lineas.

Lo siento por no haberme explicado bien desde el principio, pero lo que necesito es convertir el %s que tengo en mi textscan en dos numeros separados.

Muchas gracias.

un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar