Matlab - Eliminar filas en una estructura de forma eficiente

 
Vista:
sin imagen de perfil

Eliminar filas en una estructura de forma eficiente

Publicado por David (42 intervenciones) el 29/06/2012 05:21:46
Necesito eliminar filas de una estructura con un contenido determinador.
Lo hago mediante un bucle for o while de la forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function s = eliminafilascondicion(xlsmat)
 
indice = 111960;
 
%for i=1:indice
while indice > 1
 
    if ((strcmp(xlsmat(indice).ProcedureBlock,'PracTrialProc'))==1)
            xlsmat(indice)=[];
            indice=indice-1;
    else
        indice=indice-1;
 
    end
end
 
s = xlsmat;

Como la estructura tiene un número de filas muy grande, aunque funciona, el tiempo que se tarda es muy grande.

¿Alguien puede decirme la forma de hacerlo más eficientemente?. Muchas gracias.
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

Eliminar filas en una estructura de forma eficiente

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 29/06/2012 18:07:46
hola


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function eliminafilas_en_una_estructura
%% http://www.lawebdelprogramador.com/foros/Matlab/1339276-Eliminar_filas_en_una_estructura_de_forma_eficiente.html
% Necesito eliminar filas de una estructura con un contenido determinador. 
% Lo hago mediante un bucle for o while de la forma:
 
 
%EJEMPLO1
x(1).p='mamaddfdfd';
x(2).p='julios';
x(3).p='julios';
x(4).p='tomas';
'ORIGINAL'
x(:).p
a=struct2cell(x);
indice=strcmp(a(:),'julios');
J=find(indice==1);
x(J)=[];
'FILTRADO'
x.p
 
 
%EJEMPLO2
for i=1:111960
    y(i).p=char(60*rand(1,7)+1);
end
a=struct2cell(y);
indice=strcmp(a(:),y(round(5*(rand+1))).p);
J=find(indice==1);
y(J)=[];
'FILTRADO'
y.p


Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
programador en matlab
Servicios de programacion matlab
[email protected]

http://matlabcaballero.blogspot.com
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
sin imagen de perfil

Eliminar filas en una estructura de forma eficiente

Publicado por David (42 intervenciones) el 29/06/2012 22:37:58
Muchas gracias por la respuesta... aunque no me llega a funcionar.
¿Será porque el número de filas a eliminar es demasiado alto (14184)?
Muchas gracias por todo.


>> tic; t=eliminafilasstruct(s); toc;

size (a) ans =

53 111960


size (xlsmat) ans =

111960 1


size (s) ans =

14184 1

Matrix index is out of range for deletion.

Error in eliminafilasstruct (line 21)
xlsmat(J)=[];





1
2
3
4
5
6
7
8
9
10
11
12
function s = eliminafilasstruct(xlsmat)
indice = 111960;
a=struct2cell(xlsmat);
 
indice=strcmp(a(:),'PracTrialProc');
 
J=find(indice==1);
 
xlsmat(J)=[];
 
'FILTRADO'
s = xlsmat;
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

Eliminar filas en una estructura de forma eficiente

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 30/06/2012 01:35:52
El codigo funciona correctamente.
Pero al parecer tu, xlsmat no es como yo estoy pensando.
Alli esta el problema.
Bueno adapta ese parte que funcione correctamente con tu data.


Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
programador en matlab
Servicios de programacion matlab
[email protected]

http://matlabcaballero.blogspot.com
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
sin imagen de perfil

Eliminar filas en una estructura de forma eficiente

Publicado por David (42 intervenciones) el 30/06/2012 10:17:35
Adaptando la entrada funciona correctamente y el ahorro de tiempo con el código anterior increible. Muchas gracias por tu ayuda.

1
2
3
4
5
6
7
8
9
10
11
function s = eliminafilasstruct(xlsmat)
indice = 111960;
for i=1:indice
        y(i).p=xlsmat(i).ProcedureBlock;
end
a=struct2cell(y);
indice=strcmp(a(:),'PracTrialProc');
J=find(indice==1);
xlsmat(J)=[];
'FILTRADO'
s = xlsmat;
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

Eliminar filas en una estructura de forma eficiente

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 30/06/2012 16:11:37
Hola David.
Me puedes enviar tu data a mi correo, porque yo hago este parte del codigo
1
2
3
for i=1:111960
    y(i).p=char(60*rand(1,7)+1);
end



porque simplemene no tengo una data
1
y.p,

en cambio Tu y ya lo tienens, entonces no tienen sentido esa parte ami parecer. De esa manera aun mas se puede optimizar el codigo, el tiempo de ejecución.

Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
programador en matlab
Servicios de programacion matlab
[email protected]

http://matlabcaballero.blogspot.com
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
sin imagen de perfil

Eliminar filas en una estructura de forma eficiente

Publicado por David (42 intervenciones) el 30/06/2012 17:22:14
xlsmat es una estructura que creo a partir de un fichero de datos de excel.
Tiene numerosas columnas y lo que quiero es eliminar las filas que cumplen la condición en una sola de las columnas, por tanto realizo el código:

1
2
for i=1:indice
y(i).p=xlsmat(i).ProcedureBlock; end


para quedarme con la columna que me interesa y eliminar luego las filas que tienen el texto 'PracTrialProc'

De esta forma busco las filas a eliminar examinando la columna de datos que me interesa sin necesidad de examinar las otras columnas.
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