Matlab - Localizar los puntos más próximos entre dos archivos de datos.

 
Vista:

Localizar los puntos más próximos entre dos archivos de datos.

Publicado por Aura (33 intervenciones) el 31/07/2012 20:28:39
Hola a todos,
necesitaría ayuda para terminar este programita. Para ello voy a explicarlo brevemente, comentando mis dos dudas, y a continuación pegaré el código de lo que necesito hacer planteado para un caso concreto y simple (nada que ver con mis datos de campo)

Resulta que yo recorro una parcela de varias hectáreas con un quad que lleva un sensor que recoge datos cada segundo y cada metro, aproximadamente. Cuando termino de recorrerla, debido a que han pasado unas 3 horas, el sensor ha modificado su calibración interna con el paso del tiempo y es por esto que al terminar de recorrer la parcela, conduzco siguiendo una línea (más bien un polígono abierto xD) que intenta atravesar la mayoría (de las lineas) de la parcela.

Lo que pretendo es utilizar esta última línea como línea de calibración. Para ello, necesito 1) encontrar las mediciones de la parcela más próximas a las mediciones de la línea de calibración, 2) calcular la diferencia entre esos pares de valores, 3) interpolar con una cubic spline y 4) modificar, según un criterio, las mediciones de la parcela para tenerlas calibradas.
Mis dudas están en el paso 1 y 4.

Muchas gracias por adelantado,
un abrazo,
Aura.


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
clear all
close all
clc
 
% Archivo 1
y1=[0 1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1 0]; % Coordenada X(m)
x1=[0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3]; % Coordenada Y(m)
valor1=[ 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87]; % Valor medido
tiempo1=[101 102 103 104 105 106 107 108 109 110 110 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]; % Tiempo (s)
 
% Archivo 2 (se trata de los últimos valores del Archivo 1)
x2=[0.1 1.2 2.3 3.4]; % Coordenada X(m)
y2=[5 5 5 5]; % Coordenada Y(m)
valor2=[83 84 85 86]; % Valor medido
tiempo2=[145 146 147 148]; % Tiempo (s)
 
%% 1. Representación del problema y la solución
 
% Problema: Encontrar el 'valor1' más cercano a cada 'valor2'
figure
plot(x1,y1,'o')
    hold on
plot(x2,y2,'or')
    XLIM([-1 4]);
    YLIM([-1 11])
    XLABEL('x')
    YLABEL('y')
% DUDA 1 DE 2 -------------------------------------------------------------
% Solución: No sé cómo hallarla, pero en este ejemplo sería la siguiente...
plot(x1(6),y1(6),'sk',x1(17),y1(17),'sk',x1(28),y1(28),'sk',x1(39),y1(39),'sk')
    leyenda1 = legend('datos','línea de calibración','solución datos' );
% Datos finales
valor1_seleccionados=[valor1(6), valor1(17), valor1(28), valor1(39)];
Datos=[valor2', valor1_seleccionados'];
 
%% 2. Calcular la diferencia entre los pares de valores de los archivos 1 y 2.
 
Diferencia=zeros(1,length(valor2));
for i=1:length(valor2)
    Diferencia(i)=valor2(i)-valor1_seleccionados(i);
end
 
% Representación de la diferencia frente al tiempo.
tiempo1_seleccionados=[tiempo1(6), tiempo1(17), tiempo1(28), tiempo1(39)]; % Se obtendría una vez resuelto el apartado 1.
figure
plot(tiempo1_seleccionados,Diferencia,'o')
    XLABEL('tiempo')
    YLABEL('diferencia entre valores 1 y 2')
    XLIM([tiempo1(1) tiempo1(end)])
    leyenda2 = legend('valores');
 
%% 3. "Cubic spline" del gráfico "diferencia entre valores 1 y 2, tiempo" para corregir 'valor1'
% desde el 'tiempo1(1)' hasta el 'tiempo1(end)'
 
xx = tiempo1(1):.25:tiempo1(end);
yy = spline(tiempo1_seleccionados,Diferencia,xx);
 
figure
plot(tiempo1_seleccionados,Diferencia,'o',xx,yy,'r')
    XLABEL('tiempo')
    YLABEL('diferencia entre valores 1 y 2')
    XLIM([tiempo1(1) tiempo1(end)])
    leyenda3 = legend('valores','cubic spline (yy)');
 
% DUDA 2 DE 2 -------------------------------------------------------------
% Corregir el 'valor1' si el valor de la 'yy' es mayor que 2*0.25. Se
% corregiría el 'valor1' sumándole el valor 'yy', obteniendo la nueva variable
% 'valor1s'
 
valor1s=zeros(1,length(valor1));
for i=1:length(valor1)
    for j=1:length(yy) % No sé cómo extraer aquellos valores de 'yy' donde tenemos 'valor1'
        % o lo que es lo mismo, extraer las posiciones de los valores de 'xx' para los que
        % tenemos valores de 'tiempo1', y utilizarlas para identificar los
        % valores de 'yy'
        if yy(j)>2*0.25
            valor1s(i,j)=valor1(i)+yy(j);
        else
            valor1s(i)=valor1(i);
        end
    end
end
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

Localizar los puntos más próximos entre dos archivos de datos.

Publicado por Aura (33 intervenciones) el 01/08/2012 10:49:57
Creo que resuelto la segunda duda,

1
2
3
4
5
6
7
8
9
10
yy1=yy(1:4:end); % ya que para este caso concreto el vector 'xx' lo he cogido cada 0.25 unidades
 
valor1s=zeros(1,length(valor1));
for i=1:length(valor1)
    if yy1(i)>2*0.25
        valor1s(i)=valor1(i)+yy(i);
    else
        valor1s(i)=valor1(i);
    end
end

Pero la primera duda no sé ni siquiera plantearla,
gracias, Aura.
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

Localizar los puntos más próximos entre dos archivos de datos.

Publicado por Aura (33 intervenciones) el 01/08/2012 12:25:57
Joo, la solución que he dado para mi duda número 2, no me vale cuando quiero aplicar los datos de campo :'(
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

Localizar los puntos más próximos entre dos archivos de datos.

Publicado por Aura (33 intervenciones) el 02/08/2012 09:58:11
Buenas,

creo que en el último mensajito metí la pata, porque sí que sirve para mis datos de campo, ya que el vector 'xx' lo he elegido yo para poder hacer el spline cubic y obtener el vector 'yy'

No sé cómo hacerlo, llevo varios días dándole vueltas y probando cosas, si alguien pudiera indicarme cómo solucionarlo o echarme una mano, GRACIAS.

Un abrazo,
Aura.
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

Localizar los puntos más próximos entre dos archivos de datos.

Publicado por Aura (33 intervenciones) el 08/08/2012 13:11:54
No lo he conseguido, lo intentaré hacer manualmente, gracias al menos a quienes os habéis interesado y me habéis leído :)
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