Matlab - bucle busqueda varios elementos entre vectores - matlab

   
Vista:

bucle busqueda varios elementos entre vectores - matlab

Publicado por dfpp (12 intervenciones) el 20/12/2011 06:58:07
Hola todos,
Tengo una matriz de 187 x 45 en la que almaceno mediciones.
Estoy tratando de encontrar un patrón entre mediciones consecutivas (3 o más), que se repita en 1 o más vectores.

Por ejemplo:

-0.3 0 0.2 0.3 0.1 0.9 -0.3 0.7 -0.1 -0.4 -0.4 -0.3 -0.2 -0.1 -0.1 0.1 0.4 -0.1 0.9 0.1 1.2 0.9 0.2 0.3 -0.2

0.7 0.6 0.7 -0.1 1 0 -0.3 0.7 -0.1 0.2 -0.2 0.7 0 -0.2 0.1 0.4 0 0 -0.5 -0.7 0.2 -0.4 0.6 -0.4 0.3

0.7 0.6 0.9 0.1 0.4 0 0.2 0.2 0.2 -0.4 0.8 0.5 0.3 0.9 -0.3 0.7 0.2 -0.4 1.2 -0.3 0.7 -0.1 0.3 1.1 0.7

Espero haberme explicado claramente y que me puedan ayudar.

Gracias de antemano
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

bucle busqueda varios elementos entre vectores - matlab

Publicado por dfpp (12 intervenciones) el 20/12/2011 18:54:20
He encontrado una función que hace algo parecido a lo que yo quisiera hacer.
Se llama msalign pero es para alinear resultados de espectrometria de masas.
La diferencia es que yo no conozco los picos, por lo que necesito realizar una evaluación inicial "exploratoria".

Si alguien conoce o se le ocurre alguna otra aproximación por favor déjemelo saber.
Gracias
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

bucle busqueda varios elementos entre vectores - matlab

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 20/12/2011 23:12:10
hola dfpp.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
clear all
rep=input('Ingrese numero de repeticiones rep:');
format bank
V1=[-0.3 0 0.2 0.3 0.1 0.9 -0.3 0.7 -0.1 -0.4 -0.4 -0.3 -0.2 -0.1 -0.1 0.1 0.4 -0.1 0.9 0.1 1.2 0.9 0.2 0.3 -0.2];
V2=[ 0.7 -0.1 1 0 -0.3 0.7 -0.1 0.2 -0.2 0.7 0 -0.2 0.1 0.4 0 0 -0.5  0.8 -0.7 0.2 -0.4 0.6 -0.4 0.3 0.6];
V3=[0.7 0.6 0.9 0.1 0.4 0 0.2 0.2 0.2 -0.4 0.8 0.5 0.3 0.9 -0.3 0.7 0.2 -0.4 1.2 -0.3 0.7 -0.1 0.3 1.1 0.7];
 
M=[V1;V2;V3];
[f,c]=size(M);
k=1;
B=[];
A=[];
H=[];
for m=2:f
for i=1:c-(rep-1)
    for j=1:c-(rep-1)
        if M(1,i:i+rep-1)==M(m,j:j+rep-1)
            B=[1 [i:i+rep-1] M(1,i:i+rep-1)];
            N=[m [j:j+rep-1] M(m,j:j+rep-1)];
            [u,o]=size([B;N]);
            A(k,:)=[m [j:j+rep-1] M(m,j:j+rep-1)];
            H(1:u,1:o,k)=[B;N];
            k=k+1;
        end
    end
end
end
R=[B;A ];
display(R);
display(H)
 
EJECUCIONES:
>> elementos_repetidos1
Ingrese numero de repeticiones rep:2
 
R =
 
          1.00         19.00         20.00          0.90          0.10
          2.00          5.00          6.00         -0.30          0.70
          2.00          1.00          2.00          0.70         -0.10
          2.00          6.00          7.00          0.70         -0.10
          2.00         13.00         14.00          0.10          0.40
          3.00          6.00          7.00             0          0.20
          3.00         14.00         15.00          0.90         -0.30
          3.00         15.00         16.00         -0.30          0.70
          3.00         20.00         21.00         -0.30          0.70
          3.00         21.00         22.00          0.70         -0.10
          3.00          4.00          5.00          0.10          0.40
          3.00          3.00          4.00          0.90          0.10
 
 
H(:,:,1) =
 
          1.00          7.00          8.00         -0.30          0.70
          2.00          5.00          6.00         -0.30          0.70
 
 
H(:,:,2) =
 
          1.00          8.00          9.00          0.70         -0.10
          2.00          1.00          2.00          0.70         -0.10
 
 
H(:,:,3) =
 
          1.00          8.00          9.00          0.70         -0.10
          2.00          6.00          7.00          0.70         -0.10
 
 
H(:,:,4) =
 
          1.00         16.00         17.00          0.10          0.40
          2.00         13.00         14.00          0.10          0.40
 
 
H(:,:,5) =
 
          1.00          2.00          3.00             0          0.20
          3.00          6.00          7.00             0          0.20
 
 
H(:,:,6) =
 
          1.00          6.00          7.00          0.90         -0.30
          3.00         14.00         15.00          0.90         -0.30
 
 
H(:,:,7) =
 
          1.00          7.00          8.00         -0.30          0.70
          3.00         15.00         16.00         -0.30          0.70
 
 
H(:,:,8) =
 
          1.00          7.00          8.00         -0.30          0.70
          3.00         20.00         21.00         -0.30          0.70
 
 
H(:,:,9) =
 
          1.00          8.00          9.00          0.70         -0.10
          3.00         21.00         22.00          0.70         -0.10
 
 
H(:,:,10) =
 
          1.00         16.00         17.00          0.10          0.40
          3.00          4.00          5.00          0.10          0.40
 
 
H(:,:,11) =
 
          1.00         19.00         20.00          0.90          0.10
          3.00          3.00          4.00          0.90          0.10
 
>> elementos_repetidos1
Ingrese numero de repeticiones rep:3
 
R =
 
          1.00          7.00          8.00          9.00         -0.30          0.70         -0.10
          2.00          5.00          6.00          7.00         -0.30          0.70         -0.10
          3.00         14.00         15.00         16.00          0.90         -0.30          0.70
          3.00         20.00         21.00         22.00         -0.30          0.70         -0.10
 
 
H(:,:,1) =
 
          1.00          7.00          8.00          9.00         -0.30          0.70         -0.10
          2.00          5.00          6.00          7.00         -0.30          0.70         -0.10
 
 
H(:,:,2) =
 
          1.00          6.00          7.00          8.00          0.90         -0.30          0.70
          3.00         14.00         15.00         16.00          0.90         -0.30          0.70
 
 
H(:,:,3) =
 
          1.00          7.00          8.00          9.00         -0.30          0.70         -0.10
          3.00         20.00         21.00         22.00         -0.30          0.70         -0.10
 
>> elementos_repetidos1
Ingrese numero de repeticiones rep:4
 
R =
 
     []
 
 
H =
 
     []



Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
Profesor de Metodos Numericos con Matlab
PROGRAMADOR EN MATLAB
jjcc94@hotmail.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

bucle busqueda varios elementos entre vectores - matlab

Publicado por dfpp (12 intervenciones) el 21/12/2011 00:56:22
Muchas gracias Jose!
Estoy estudiando tu código porque hay cosas que aún no comprendo en mi novatada con matlab.
Abrazos y espero poder comentar pronto.
Diego
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

bucle busqueda varios elementos entre vectores - matlab

Publicado por dfpp (12 intervenciones) el 21/12/2011 14:03:20
Hola de nuevo,

Estudié el código y creo que lo entendí en su totalidad... Mil gracias.

Hice una pequeña modificación al primer bloque for para automatizar la búsqueda en todos los vectores.

Sin embargo tengo varias dudas:

1. No he encontrado la manera de exportar una matriz multidimensional a excel.
2. Al exportar el resumen a excel, debido a la gran cantidad de apareamientos da la impresión de que no se exporta la totalidad del análisis (ver adelante el código).

¿Existe alguna forma de ir exportando poco a poco los resultados de los bucles en una misma hoja de excel, de manera que los resultados de un bucle queden debajo del anterior sin borrar los datos ya ingresados?

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
32
clear all
rep=input('Ingrese numero de repeticiones rep:');
format bank
 
M=input('Ingrese la matriz');
[f,c]=size(M);
k=1;
B=[];
A=[];
H=[];
 
for l=1:f
    for m=l+1:f
        for i=1:c-(rep-1)
            for j=1:c-(rep-1)
                if M(l,i:i+rep-1)==M(m,j:j+rep-1)
                    B=[l (i:i+rep-1) M(l,i:i+rep-1)];
                    N=[m (j:j+rep-1) M(m,j:j+rep-1)];
                    [u,o]=size([B;N]);
                    A(k,:)=[m (j:j+rep-1) M(m,j:j+rep-1)];
                    H(1:u,1:o,k)=[B;N];
                    k=k+1;
                end
            end
        end
    end
end
 
R=[B;A ];
display(R);
xlswrite('patterns.xls', R, rep, 'A1');
display(H);
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

bucle busqueda varios elementos entre vectores - matlab

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 21/12/2011 16:59:45
hola dfpp.
Revisa este programa y lo adaptas a lo estas pidiendo.
http://www.lawebdelprogramador.com/foros/Matlab/1265536-xlswrite.html


Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
Profesor de Metodos Numericos con Matlab
PROGRAMADOR EN MATLAB
jjcc94@hotmail.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

bucle busqueda varios elementos entre vectores - matlab

Publicado por dfpp (12 intervenciones) el 21/12/2011 23:38:49
Mil gracias Jose,
Funciona de lujo!
Diego
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

bucle busqueda varios elementos entre vectores - matlab

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 21/12/2011 23:57:23
Hola dfpp.
Me podrias enviar tu codigo final a mi correo, para verlo.


Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
Profesor de Metodos Numericos con Matlab
PROGRAMADOR EN MATLAB
jjcc94@hotmail.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

bucle busqueda varios elementos entre vectores - matlab

Publicado por dfpp (12 intervenciones) el 23/12/2011 02:37:47
Hola Jose,
Aunque te lo envié a tu correo lo dejo acá por si a alguien le sirve luego.
Saludos y gracias,
Diego

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
32
33
34
35
36
clear all
rep=input('Ingrese numero de repeticiones rep:');
format bank
 
M=input('Ingrese la matriz');
[f,c]=size(M);
k=1;
B=[];
A=[];
H=[];
 
for l=1:f
    for m=l+1:f
        for i=1+3:c-3-(rep-1)
            for j=1+3:c-3-(rep-1)
                if M(l,i:i+rep-1)==M(m,j:j+rep-1)
                    B=[l (i:i+rep-1) M(l,i:i+rep-1)];
                    N=[m (j:j+rep-1) M(m,j:j+rep-1)];
                    [u,o]=size([B;N]);
                    A(k,:)=[m (j:j+rep-1) M(m,j:j+rep-1)];
                        [fid, texto]=fopen('patterns_9.xls','a');
                        fprintf(fid,'\n %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t%f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t',k,B);
                        fprintf(fid,'\n %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t%f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t',k,N);
                        fclose(fid);
                        type patterns_9.xls
                    H(1:u,1:o,k)=[B;N];
                    k=k+1;
                end
            end
        end
    end
end
R=[B;A ];
display(R);
display(H);
beep;
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

bucle busqueda varios elementos entre vectores - matlab

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 23/12/2011 03:11:45
Hola Diego.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
clear all
rep=input('Ingrese numero de repeticiones rep:');
format bank
 
%M=input('Ingrese la matriz');
V1=[-0.3 0 0.2 0.3 0.1 0.9 -0.3 0.7 -0.1 -0.4 -0.4 -0.3 -0.2 -0.1 -0.1 0.1 0.4 -0.1 0.9 0.1 1.2 0.9 0.2 0.3 -0.2];
V2=[ 0.7 -0.1 1 0 -0.3 0.7 -0.1 0.2 -0.2 0.7 0 -0.2 0.1 0.4 0 0 -0.5  0.8 -0.7 0.2 -0.4 0.6 -0.4 0.3 0.6];
V3=[0.7 0.6 0.9 0.1 0.4 0 0.2 0.2 0.2 -0.4 0.8 0.5 0.3 0.9 -0.3 0.7 0.2 -0.4 1.2 -0.3 0.7 -0.1 0.3 1.1 0.7];
 
M=[V1;V2;V3];
[f,c]=size(M);
k=1;
B=[];
A=[];
H=[];
 
for l=1:f
    for m=l+1:f
        for i=1+3:c-3-(rep-1)
            for j=1+3:c-3-(rep-1)
                if M(l,i:i+rep-1)==M(m,j:j+rep-1)
                    B=[l (i:i+rep-1) M(l,i:i+rep-1)];
                    N=[m (j:j+rep-1) M(m,j:j+rep-1)];
                    [u,o]=size([B;N]);
                    A(k,:)=[m (j:j+rep-1) M(m,j:j+rep-1)];
                    H(1:u,1:o,k)=[B;N];
                    k=k+1;
                end
            end
        end
    end
end
[nombre,ruta]=uiputfile('*.xls','GUARDAR ARCHIVO');
if nombre==0
     return;
elseif sum(size(H))==0
    fprintf('NO HAY VECTORES CON %2d REPETICIONES\n',rep)
    return;
else
    [n,m,f]=size(H);
    t=length(B);
    E='%f\t';
    for i=1:t-1
       E=[E,'%f\t' ];
    end
    E=[E,'\n'];
    for i=1:f
        [fid, texto]=fopen([ruta nombre],'a');
        fprintf(fid,E,H(1,:,i));
        fprintf(fid,E,H(2,:,i));
    end
    fclose(fid);
  end
R=[B;A ];



Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
Profesor de Metodos Numericos con Matlab
PROGRAMADOR EN MATLAB
jjcc94@hotmail.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

bucle busqueda varios elementos entre vectores - matlab

Publicado por dfpp (12 intervenciones) el 23/12/2011 10:53:27
Gracias Jose.

Sin embargo con el código que añades vuelvo a tener el problema del número de registros (muestra solo 1018 cuando de la otra manera muestra más de 9000!) y además me genera los siguientes errores:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
??? Error using ==> fprintf
Invalid file identifier.  Use fopen to generate a valid file identifier.
 
Error in ==> elementos_repetidos2 at 44
 
 
Error in ==> run at 57
 
 
??? C:\ruta\toolbox\matlab\codetools\opentoline.m: Too many files open; check that FILES =
20 in your CONFIG.SYS file.
 
??? C:\ruta\toolbox\matlab\codetools\opentoline.m: Too many files open; check that FILES =
20 in your CONFIG.SYS file.
 
??? C:\ruta\toolbox\matlab\codetools\opentoline.m: Too many files open; check that FILES =
20 in your CONFIG.SYS file.


En un rato vuelvo a hacer unas pruebas...

Saludos,

Diego
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

bucle busqueda varios elementos entre vectores - matlab

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 23/12/2011 13:03:45
hola Diego.
Primero, hasta ahorita no me haz todo la informacion posible.
Me hablas de un data M, pero no me haz enviado ese data ami correo.
Alli esta uno de los problemas de los usuarios del foro. Dan poco informacion, luego dicen que el programa esta mal, q no funciona como ellos quieren. El programa funciona correctamente.
Otro errror posible puede ser la version de matlab. Ya que al mejorar el codigo, utlizo funciones nuevas de matlab.


Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
Profesor de Metodos Numericos con Matlab
PROGRAMADOR EN MATLAB
jjcc94@hotmail.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

bucle busqueda varios elementos entre vectores - matlab

Publicado por dfpp (12 intervenciones) el 23/12/2011 19:45:07
Hola Jose,
Las matrices que uso son muy similares a la que expuse y que has usado en tus ejemplos pero son de 187 filas x 51 columnas.
Tu código funciona correctamente cuando son pocos emparejamientos, pero alrededor de 1000 me saca nuevamente los errores que te menciono.
Mi versión de Matlab es 2010a.
Te envío una matriz a tu correo.
Saludos,
Diego
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

bucle busqueda varios elementos entre vectores - matlab

Publicado por dfpp (12 intervenciones) el 23/12/2011 20:40:56
Añadí al código:
1
fclose('all');

debido a que por algún motivo el archivo queda abierto (no lo puedo abrir sin tener que cerrar Matlab) a pesar de la instrucción
1
fclose(fid);

de tu código.

Sin embargo, eso no solucionó el problema.

Si utilizo la siguiente línea:

1
2
3
4
5
6
7
8
9
>> fopen('all') % List all open files
 
ans =
 
  Columns 1 through 8
 
          3.00          4.00          5.00          6.00          7.00          8.00          9.00         10.00
 
  Columns 9 through 16

... hasta

1
2
3
Columns 505 through 509
 
        507.00        508.00        509.00        510.00        511.00


Como si cada respuesta la tratara como un archivo???

Iré posteando los resultados de pruebas que haga... espero no ser impertinente.

Gracias,

Diego
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

bucle busqueda varios elementos entre vectores - matlab

Publicado por dfpp (12 intervenciones) el 23/12/2011 22:22:57
Hoa Jose,

El problema al parecer lo causa el incluir la orden
1
[fid, texto]=fopen([ruta nombre],'a');

dentro del bucle. Esto hace que Matlab trate de abrir las "respuestas" (no se si las matrices o los apareamientos) como un archivo.

Logro ver los resultados al sacar la orden mencionada del bucle (la pasé a uno de mayor jerarquía, pero no se si haya necesidad de ello)

1
2
3
4
5
6
7
8
9
10
11
E=[E,'\n'];
    for i=1
        [fid, texto]=fopen([ruta nombre],'a');
        for i=1:f
            fprintf(fid,E,H(1,:,i));
            fprintf(fid,E,H(2,:,i));
        end
    end
    fclose(fid);
end
R=[B;A ];


Saludos,

Diego
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

bucle busqueda varios elementos entre vectores - matlab

Publicado por dfpp (12 intervenciones) el 23/12/2011 22:24:16

...dentro del bucle. Esto hace que Matlab trate de abrir las "respuestas" (no se si las matrices o los apareamientos) como un archivo.


Me refiero a cada respuesta como un archivo separado...
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

bucle busqueda varios elementos entre vectores - matlab

Publicado por dfpp (12 intervenciones) el 24/12/2011 00:42:46
Hola Jose,

Funciona correctamente sin incluir
1
[fid, texto]=fopen([ruta nombre],'a');


dentro de ningún bucle, así:

1
2
3
4
5
6
[fid, texto]=fopen([ruta nombre],'a');
        for i=1:f
            fprintf(fid,E,H(1,:,i));
            fprintf(fid,E,H(2,:,i));
        end
fclose(fid);

Como el error se generaba antes de alcanzar la orden
1
fclose(fid);

el archivo quedaba abierto.

En lo que leí hay quienes recomiendan utilizar
1
2
3
cerrar_archivo= onCleanup(@() fclose(fid))
...
delete(cerrar_archivo)

http://www.mathworks.com/help/techdoc/ref/oncleanup.html
pero desconozco si sería útil en este caso.

La cuestión es que la optimización que presentas hace que todo funcione por lo menos 10 VECES más rápido que como lo estaba haciendo previamente.

Por último quisiera preguntarte si existe una manera de presentar un resumen de los emparejamientos encontrados sin que se repitan, algo como lo que se hace con un Select Distinct en bases de datos.

Mil gracias de nuevo.

Diego
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