Matlab - Script Matlab + combinación vectores + trabajo con tabla

 
Vista:
sin imagen de perfil

Script Matlab + combinación vectores + trabajo con tabla

Publicado por Iván (9 intervenciones) el 28/11/2016 01:49:07
Buenas, como bien escribo en el título, mi consulta se basa en un ejercicio multinivel, que se basa en lo siguiente.
Como primera parte intento diseñar un script de Matlab, o en su defecto varios scripts, cuya función es la de extraer datos útiles de un archivo de texto (.txt o .dat). Una vez hecho lo primero, debo combinar los vectores obtenidos en una tabla, aquí tengo el primer problema ya que utilizando los distintos scripts, no consigo que todos los vectores tengan el mismo tamaño. Cuando importo desde el editor de Matlab genero un vector 44x1, sin embargo cuando ejecuto el script correspondiente a la selección importada se genera un 43x1. No sé como solucionarlo ya que todos los vectores deberían tener el mismo tamaño.

Después de esto me preguntaba como puedo hacer para buscar un dato en la tabla resultante de la combinación de vectores, ya que pretendo eliminar las filas que contengan un dato en concreto, por ejemplo:

- Los datos de la quinta columna de la tabla son en su mayoría, ceros, pero existen casos en los que el dato es distinto de 0, no por error, sino porque es el obtenido, pues para el caso en el que su valor en la cuarta fila sea distinto de 0, necesito eliminar toda la cuarta fila. Es decir, que revise toda la columna y cuando encuentre un valor distinto de 0, borre toda la fila correspondiente.

Después de esto necesito aplicar una división en la tabla. En la tercera columna tengo datos en forma de texto, pero estos datos no son siempre iguales. Por ejemplo, supongamos que tengo 5 filas y en la tercera columna tengo, por fila, [3 3 2 2 3], necesitaría separar los datos en dos tablas, en la primera tabla todas las filas cuyo valor de la tercera columna sea tres, en la segunda tabla todas las filas cuyo valor de la tercera columna sea dos, de esta manera separaría de forma lógica los datos para trabajar a posteriori. No sé si Matlab permite realizar esto ni cómo.

Por último, una vez aplicados los dos primeros pasos, necesito trabajar con la tabla. Debo buscar un dato de una columna que sea distinto de 0, esta vez no para eliminarlo, sino para emplearlo en cálculos. Es decir, una función que busque un valor distinto de 0 en esa columna, una vez hecho eso necesito otros dos datos para los cálculos, pero debo tomarlos de la tabla, de un punto cercano cercano al que el valor anterior era distinto de 0, es decir, que si encuentro el valor en la 31ª fila, no puedo utilizar los otros datos de la 1ª y 2ª fila, sino que busque alrededor de la 31ª fila en otras dos columnas que sean distintas de 0. No sé exactamente como realizarlo con Matlab, si utilizando la función find y los condicionales.

Una vez hecho todo esto ya tendría que repetir el cálculo para todos los casos en los que esa columna sea distinta de 0, por ejemplo, en la 31ª fila, en la 56ª, etc. Creo que se podría realizar con un bucle pero no sé exactamente cómo.

Agradecería mucho la ayuda, si alguien tiene más dudas del archivo con el que estoy trabajando para saber qué es exactamente lo que busco puedo adjuntar posteriormente.
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
sin imagen de perfil

Script Matlab + combinación vectores + trabajo con tabla

Publicado por Iván (9 intervenciones) el 28/11/2016 17:21:26
Buenas, actualmente he trabajado con el editor de Matlab, y mediante el uso de distintos separadores y distintas condiciones que se cumplen a lo largo de todo el documento de trabajo, he conseguido separar los datos que necesito en vectores columna. El problema es que, una vez importo los datos con el editor no tengo ningún tipo de problema, pero debo escribir el código utilizado para ello, por lo que recurro a la función del editor de "Generar Script", el script generado está bien en los casos en los que el último dato de la columna no es un dato vacío, en caso de que en la última no exista valor, se importa una columna menos con el script respecto a usar el editor, aunque esto puedo solucionarlo añadiendo un "0" al final del vector columna. El siguiente problema se encuentra en un script en concreto que adjuntaré junto con mi archivo de trabajo en este post. Cuando importo la selección con la orden de "Reemplazar datos inexportables por 0.0", lo realiza correctamente desde el editor, cabe mencionar que trabajo con números en esa columna y empleo esa orden para que las filas que tienen algo más que números y que no necesito que aparezca nada sean ceros. Cuando ejecuto el script correspondiente creado por Matlab tengo un problema en las filas cuya estructura es "Número texto número texto", ya que en lugar de aparecer un cero, como desde el editor, aparece el número, el cual no necesito para nada. Utilizo la función de "generar script" de Matlab ya que no se cómo crearlos por mi mismo. Adjuntaré el archivo de trabajo que estoy utilizando, el cual es menor que el archivo real, pero que me sirve para la creación de los scripts. Además del archivo de trabajo "trabajo.txt", he adjuntado todos los scripts creados, la información y fallos de estos son:

- SCRFECHAHORA: Se importan correctamente todos los datos en formato de fecha, dado que la última fila es un número no tiene problema ni lo tendrá con el documento real.

- SCRICAONUMBER: Igual que en el anterior pero en formato texto, se importan correctamente y no habrá problema posteriormente.
A partir de aquí el resto son scripts son de tipo numérico.

- SCRGROUNDSPEED/SCRTAS/SCRTRUETRACK/SCRLATILONGI/SCRHEADING: Se importan correctamente desde el editor pero al ejecutar el script no se importa correctamente la última fila, sino que se reduce el tamaño en uno, solucionable añadiendo un cero en la última columna como solución rápida.

-SCRVERTICALRATE: Además del problema del resto de scripts que tratan números, en este caso se importan correctamente desde el editor pero al ejecutar el script tengo el problema de dos datos que se importan como números cuando según las órdenes del editor deberían aparecer como ceros. Como solución puedo importar desde el editor y no ejecutar el script pero si alguien sabe como modificar el código del script para solucionarlo lo agradecería.

Una vez aquí, si consigo solucionar los problemas de los dos últimos párrafos, e incluso si no encuentro solución con el código puedo pasar a la solución rápida, debo crear una tabla con todos los vectores columna obtenidos de los distintos scripts. Una vez creada la tabla debo buscar en la columna "VERTICALRATE" los datos que sean distintos de cero, y eliminar toda la fila en la que el valor del "VERTICALRATE" sea distinto de cero ya que los datos de esa fila no son válidos, por la propia naturaleza del archivo de trabajo.

Muchas gracias por la ayuda.
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 Daniel
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Script Matlab + combinación vectores + trabajo con tabla

Publicado por Daniel (264 intervenciones) el 29/11/2016 21:38:39
Hola Ivan, el proceso de buscar palabras claves en un texto no muy ordenado como este (para mi) conviene hacerlo con el texto lo mas literal posible, principalmente cuando en algunas filas no hay datos, etc.
También te recomiendo que saques la información del archivo con un solo script (o con la minima cantidad) lo más general posible para que no tengas que ir cambiando cada uno individualmente... Asi si está bien hecho anda siempre y no hay que ir emparchando cada uno...

Te mando la idea que yo tengo para esto... Está escrito para reemplazar solo dos de tu variables (VR y GS) pero te dejé comentado (con 1 linea por clave) donde agregar la demás variables en el mismo código

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
clc
clear all
filename = '.\trabajo.txt';
delimiter = {''};
formatSpec = '%s[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID,'%s','delimiter','\n');
fclose(fileID);
% numero de filas
n=size(dataArray{:},1);
 
% iniciacion de claves (1 linea por clave)
VR=NaN(n,1);
GS=NaN(n,1);
 
% bucle por linea
for j=1:n
    % divide la linea por por sus espacios en blanco
    line=strsplit(dataArray{1,1}{j,1});
 
    % busca las claves (1 linea por clave)
    sal_VR=strfind(line,'VR');
    sal_GS=strfind(line,'GS');
 
    % encuentra la posicion de las claves (1 linea por clave)
    dd_VR=find(cell2mat(cellfun(@(x) isempty(x),sal_VR, 'UniformOutput',false))==0);
    dd_GS=find(cell2mat(cellfun(@(x) isempty(x),sal_GS, 'UniformOutput',false))==0);
 
    % si no encuentra la clave sigue, si la encuentra se fija el numero que
    % sigue a la clave (ej GS 240 TT 12 agarra el numero que sigue a GS, es decir 240)
 
    %(1 if ... end por clave)
    if ~isempty(dd_VR)
        VR(j)=str2double(line{dd_VR+1});
    end
 
    if ~isempty(dd_GS)
        GS(j)=str2double(line{dd_GS+1});
    end
end


comentanos si te sirvió y como te fue

Saludos

Daniel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Script Matlab + combinación vectores + trabajo con tabla

Publicado por Iván (9 intervenciones) el 29/11/2016 22:19:55
Buenas Daniel, parece una buena idea, mucho mejor que la mía seguro. Mi problema es que no se trabajar con scripts en Matlab y he estudiado bastante poco este lenguaje, por lo que usé la solución más rápida que encontré. Acabo de probar a ejecutar el script pero no he podido debido a este error con textscan:
Error using textscan
Invalid file identifier. Use fopen to generate a valid file identifier.

Error in Untitled (line 7)
dataArray = textscan(fileID,'%s','delimiter','\n');

No sé muy bien como solucionarlo así que lo adjunto aquí por si sabías de qué se trata. Dado que no he podido iniciarlo tenía la siguiente duda. El array que crea el script, ordena los datos según las filas, es decir, si solo encuentra una de las 7 variables en la primera línea, ¿aparecen 6 datos como cero y 1 dato con su correspondiente valor? En caso de ser así me sería muy útil conseguir ponerlo en marcha. Al margen de esto he seguido avanzando para acabar con el trabajo ya que me resta 1 semana antes de presentarlo. Ahora mismo me encuentro estancado en un punto. He conseguido eliminar las filas de la tabla cuando se da una condición mediante el comando "find", con este mismo comando he conseguido separar la tabla según los números ICAO de las aeronaves, para que no exista error de cruzar datos de una aeronave con otra en los cálculos, una vez hecho esto me encuentro en este punto:
Tengo varias tablas, la primera con fecha y hora, en formato fecha (date), tiene2 columnas. La segunda tabla es de una columna y contiene los números ICAO de las aeronaves, la utilizo para separar los datos según con qué aeronave trato, se encuentra en formato de texto (string). La última tabla consta de siete columnas y contiene todos los datos para los cálculos, está en formato numérico (double), y es con la que más debo trabajar. En esta tabla utilizo 4 columnas para los cálculos, las 4 últimas. El caso es que en las columnas 5 y 7 se encuentran 2 datos que aparecen poco en el mensaje, la TAS y el HDG. Utilizo el comando find para crear un vector columna que me indica las posiciones en la quinta y séptima columna para los que TAS y HDG es distinto de 0. Pongamos que, encuentro 7 valores en todo el documento para el TAS distintos de 0 y obtengo un vector 7x1 mientras que encuentro 5 valores de HDG distintos de 0 obteniendo un vector 5x1. Necesito encontrar valores de la cuarta columna, que sería GS, y de la sexta columna, que sería TT, distintos de cero, pero en posiciones cercanas a los encontrados para el TAS y el HDG, es decir, que si los valores para el TAS se han encontrado en las filas 15,37,45,85,101,132,155, necesito encontrar valores distintos de 0 para el GS, que está en la cuarta columna, en posiciones cercanas a las filas mencionadas, para crear un vector columna de 7x1 para la GS, y lo mismo iría para el TT, que está en la sexta fila, respecto al HDG, debo encontrar valores distintos de 0 en las filas cercanas a los valores encontrados para el vector 5x1 del HDG para crear un vector del mismo tamaño. Esto se debe a que las filas vienen dadas en orden cronológico, por eso el tema de la tabla en formato de fecha. Después de esto debería arreglar el vector de mayor tamaño para que los cuatro vectores tengan el mismo tamaño, ya que deberé aplicar posteriormente el teorema del coseno a estos vectores, por lo que necesitaré mismo tamaño para todos. ¿Existe alguna manera de hacer esto? Ya que no tengo mucho conocimiento sobre esto y no sé como hacerlo. En cuanto consiga resolverlo ya habría solucionado el problema de los cálculos y me quedaría una última parte que comentaré posteriormente. Al margen de esto, ¿existe alguna manera de combinar los vectores columna aunque tengan diferentes formatos? Es decir, crear una tabla combinando las 10 columnas que tengo, manteniendo el formato, o cambiando los formatos para igualarlos y modificarlos posteriormente si es necesario para el último apartado.

Si no te es posible ayudarme con el script para la obtención de los vectores, preferiría que me ayudases con el tema de buscar los valores según la posición para el apartado de los cálculos y así seguir para finalizar el trabajo correctamente. Muchas gracias por la ayuda, 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
Imágen de perfil de Daniel
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Script Matlab + combinación vectores + trabajo con tabla

Publicado por Daniel (264 intervenciones) el 29/11/2016 22:23:36
Supongo que es la ruta del archivo, vuelve a poner la ruta original y prueba nuevamente

1
filename = 'C:\Users\ivaniin\Desktop\trabajo.txt';

Saludos

Daniel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Script Matlab + combinación vectores + trabajo con tabla

Publicado por Iván (9 intervenciones) el 30/11/2016 01:24:33
Buenas Daniel, ahora funciona perfectamente, me pondré a trabajar con el para ver si soy capaz de hacer lo mismo con el resto de variables. He utilizado el siguiente comando para sustituir los NaN que se generan por ceros y así poder trabajar posteriormente con find.

GS(isnan(GS)) = 0;
VR(isnan(VR)) = 0;
return

Me preguntaba si podrías ayudarme con el tema de la tabla y la creación de los vectores para realizar los cálculos. Como explico anteriormente no sé como realizarlo de manera simple y lo único que se me ocurre es el empleo de condicionales, pero no sé si funcionaría bien. También me preguntaba si sabes como combinar en una tabla elementos en formato date, string y numérico o si no es posible hacerlo, aunque esto no es de vital importancia.

Un saludo y muchas 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 Daniel
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Script Matlab + combinación vectores + trabajo con tabla

Publicado por Daniel (264 intervenciones) el 30/11/2016 18:38:44
Acá te mando una versión mas completa donde todos los datos están guardados en un dataset (que es la estructura de datos apropiada para guardar datos con distinto formato)

Si ves abres la variable "resultados" en el workspace veras aparece casi como una tabla de excel...

Al final del código muestra algunos filtrados "típicos" de datos del dataset de resultados

Si quieres agregar eliminar o cambiar las variables que busca debes modificar solo estas tres filas

claves={'ICAO:','GS','TAS','TT','LAT','LON','HDG','VR'};
tipo=[1 0 0 0 0 0 0 0];

matriz(1,1:10)={'Fecha','Hora','ICAO','GS','TAS','TT','LAT','LON','HDG','VR'};

en claves debes agregar/quitar/cambiar la clave nueva que deseas buscar. la variable tipo tiene 1 si la clave que buscas es un string y cero se es un numero (el orden de los valores de tipo debe coincidir con el de claves). Finalmente la linea matriz(1,1:10)=.... Es la que le asigna los nombres a cada columna de la matriz... si por ejemplo agregas una clave deberás cambiar el 10 por 11 y agregar un nombre para esa columna en el mismo orden que las claves...
Te dejo el código


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
clc
clear all
filename = 'C:\Users\ivaniin\Desktop\trabajo.txt';
delimiter = {''};
formatSpec = '%s[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID,'%s','delimiter','\n');
fclose(fileID);
% numero de filas
n=size(dataArray{:},1);
 
% iniciacion d variables (1 linea por clave)
claves={'ICAO:','GS','TAS','TT','LAT','LON','HDG','VR'};
tipo=[1 0 0 0 0 0 0 0];
nc=numel(claves);
% Matriz=mat2cell(zeros(n,nc));
matriz(1,1:10)={'Fecha','Hora','ICAO','GS','TAS','TT','LAT','LON','HDG','VR'};
 
% bucle por linea
for j=1:n
    % divide la linea por por sus espacios en blanco
    line=strsplit(dataArray{1,1}{j,1});
    matriz{j+1,1}=line{1}; % fecha
    matriz{j+1,2}=line{2}; % hora
    for c=1:nc
         % busca las claves (1 linea por clave)
        sal=strfind(line,claves{c});
 
        % encuentra la posicion de las claves (1 linea por clave)
        dd=find(cell2mat(cellfun(@(x) isempty(x),sal, 'UniformOutput',false))==0);
 
        if tipo(c)==0
 
            if isempty(dd)
                matriz{j+1,c+2}=0;
            else
                matriz{j+1,c+2}=str2double(line{dd+1});
            end
        else
            if isempty(dd)
                matriz{j+1,c+2}='';
            else
                matriz{j+1,c+2}=line{dd+1};
            end
        end
    end
end
resultados=cell2dataset(matriz);
 
% condiciones sobre el set de datos
condicion1=(resultados.TT~=0);
condicion2=and(resultados.TT~=0,resultados.GS>430);
%todos
disp('todos')
disp(resultados(:,:))
% los que cumplen condicion 1
disp('los que cumplen condicion 1')
disp(resultados(condicion1,:))
 
% los que cumplen condicion 2
disp('los que cumplen condicion 2')
disp(resultados(condicion2,:))
 
% solo los ICAO de los que cumplen la condicion 1
disp('solo los ICAO de los que cumplen la condicion 1')
disp(resultados.ICAO(condicion1))
 
% solo los ICAO de los que cumplen la condicion 1 (sin repetir)
disp('solo los ICAO de los que cumplen la condicion 1 (sin repetir)')
disp(unique(resultados.ICAO(condicion1)))


Saludos

Daniel

Se podes puntuar mejor, así los demás ven que es una solución que pueden usar o no...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Script Matlab + combinación vectores + trabajo con tabla

Publicado por Iván (9 intervenciones) el 02/12/2016 01:30:52
Buenas Daniel, funciona perfectamente y obtengo todos los datos de manera ordenada, pero tengo el problema de que al tratarse de un dataset no puedo trabajar con el resto de scripts que tengo ya que requieren de números y da error al introducirlos con el formato dataset. Por lo demás la tabla es exactamente lo que buscaba. ¿Hay alguna manera de que ciertas columnas se conserven como números y otras como strings para trabajar posteriormente o debería crear otra tabla con los datos numéricos para trabajar con ella?

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
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

Script Matlab + combinación vectores + trabajo con tabla

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 02/12/2016 05:47:15
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
clc
clear all
%filename = 'C:\Users\ivaniin\Desktop\trabajo.txt';
filename ='trabajo.txt';
delimiter = {''};
formatSpec = '%s[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID,'%s','delimiter','\n');
fclose(fileID);
n=size(dataArray{:},1);% numero de filas
% iniciacion d variables (1 linea por clave)
claves={'ICAO:','GS','TAS','TT','LAT','LON','HDG','VR'};
tipo=[1 0 0 0 0 0 0 0];
nc=numel(claves);
% Matriz=mat2cell(zeros(n,nc));
matriz(1,1:10)={'Fecha','Hora','ICAO','GS','TAS','TT','LAT','LON','HDG','VR'};
% bucle por linea
for j=1:n
    % divide la linea por por sus espacios en blanco
    line=strsplit(dataArray{1,1}{j,1});
    matriz{j+1,1}=line{1}; % fecha
    matriz{j+1,2}=line{2}; % hora
    for c=1:nc
           sal=strfind(line,claves{c});% busca las claves (1 linea por clave)
        dd=find(cell2mat(cellfun(@(x) isempty(x),sal, 'UniformOutput',false))==0);% encuentra la posicion de las claves (1 linea por clave)
        if tipo(c)==0
            if isempty(dd)
                matriz{j+1,c+2}=0;
            else
                matriz{j+1,c+2}=str2double(line{dd+1});
            end
        else
            if isempty(dd)
                matriz{j+1,c+2}='';
            else
                matriz{j+1,c+2}=line{dd+1};
            end
        end
    end
end
resultados=cell2dataset(matriz);
condicion1=(resultados.TT~=0);% condiciones sobre el set de datos
condicion2=and(resultados.TT~=0,resultados.GS>430);
disp('todos') %todos
disp(resultados(:,:))
disp('los que cumplen condicion 1')% los que cumplen condicion 1
disp(resultados(condicion1,:))
disp('los que cumplen condicion 2')% los que cumplen condicion 2
disp(resultados(condicion2,:))
disp('solo los ICAO de los que cumplen la condicion 1')% solo los ICAO de los que cumplen la condicion 1
disp(resultados.ICAO(condicion1))
disp('solo los ICAO de los que cumplen la condicion 1 (sin repetir)')% solo los ICAO de los que cumplen la condicion 1 (sin repetir)
disp(unique(resultados.ICAO(condicion1)))
resultados1=dataset2cell(resultados(:,4:10))
resultados2=cell2mat(resultados1(2:end,:))

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
>> combinacion_de_vectores
todos
    Fecha               Hora                  ICAO            GS        TAS    TT        LAT       LON        HDG    VR
    '2016-11-17'        '14:33:41.982'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:42.303'        '4CA623'        434.28      0    199.65         0          0      0     0
    '2016-11-17'        '14:33:42.514'        '4CA623'             0      0         0    43.636    -6.3454      0     0
    '2016-11-17'        '14:33:42.723'        '4CA73B'         425.5      0    211.45         0          0      0     0
    '2016-11-17'        '14:33:42.834'        '4CA623'             0      0         0    43.635    -6.3458      0     0
    '2016-11-17'        '14:33:42.935'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:42.935'        '4CA623'        434.28      0    199.65         0          0      0     0
    '2016-11-17'        '14:33:43.039'        '4CA73B'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:43.042'        '4CA73B'             0      0         0    43.479    -5.8295      0     0
    '2016-11-17'        '14:33:43.356'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:43.462'        '4CA623'        434.28      0    199.65         0          0      0     0
    '2016-11-17'        '14:33:43.462'        '4CA73B'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:43.462'        '4CA623'             0      0         0    43.634    -6.3462      0     0
    '2016-11-17'        '14:33:43.670'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:43.986'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:43.986'        '4CA73B'             0      0         0    43.477    -5.8307      0     0
    '2016-11-17'        '14:33:43.988'        '4CA623'        434.28      0    199.65         0          0      0     0
    '2016-11-17'        '14:33:44.196'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:44.404'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:44.405'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:44.726'        '4CA73B'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:44.727'        '4CA73B'             0      0         0    43.476    -5.8318      0     0
    '2016-11-17'        '14:33:44.827'        '4CA73B'         425.5      0    211.45         0          0      0     0
    '2016-11-17'        '14:33:44.932'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:44.936'        '4CA623'             0      0         0    43.631    -6.3477      0     0
    '2016-11-17'        '14:33:45.038'        '4CA73B'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:45.039'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:45.040'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:45.040'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:45.141'        '4CA623'        434.28      0    199.65         0          0      0     0
    '2016-11-17'        '14:33:45.146'        '4CA73B'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:45.249'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:45.256'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:45.568'        '4CA623'             0      0         0     43.63    -6.3482      0     0
    '2016-11-17'        '14:33:45.672'        '4CA623'        434.28      0    199.65         0          0      0     0
    '2016-11-17'        '14:33:45.783'        '4CA73B'         425.5      0    211.45         0          0      0     0
    '2016-11-17'        '14:33:45.885'        '4CA73B'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:45.986'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:45.987'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:33:45.988'        '4CA623'             0      0       224         0          0      0     0
    '2016-11-17'        '14:33:45.988'        '4CA623'             0    446       200         0          0      0     0
    '2016-11-17'        '14:33:46.201'        '4CA623'        434.28      0    199.65         0          0      0     0
    '2016-11-17'        '14:33:46.727'        '4CA623'        434.28      0    199.65         0          0      0     0
    '2016-11-17'        '14:33:46.834'        '4CA623'             0      0         0         0          0      0     0
    '2016-11-17'        '14:32:28.275'        '4CA73B'        424.65      0    211.52         0          0      0    64
    '2016-11-17'        '14:33:22.511'        '4CA623'             0      0         0         0          0    209     0
 
los que cumplen condicion 1
    Fecha               Hora                  ICAO            GS        TAS    TT        LAT    LON    HDG    VR
    '2016-11-17'        '14:33:42.303'        '4CA623'        434.28      0    199.65    0      0      0       0
    '2016-11-17'        '14:33:42.723'        '4CA73B'         425.5      0    211.45    0      0      0       0
    '2016-11-17'        '14:33:42.935'        '4CA623'        434.28      0    199.65    0      0      0       0
    '2016-11-17'        '14:33:43.462'        '4CA623'        434.28      0    199.65    0      0      0       0
    '2016-11-17'        '14:33:43.988'        '4CA623'        434.28      0    199.65    0      0      0       0
    '2016-11-17'        '14:33:44.827'        '4CA73B'         425.5      0    211.45    0      0      0       0
    '2016-11-17'        '14:33:45.141'        '4CA623'        434.28      0    199.65    0      0      0       0
    '2016-11-17'        '14:33:45.672'        '4CA623'        434.28      0    199.65    0      0      0       0
    '2016-11-17'        '14:33:45.783'        '4CA73B'         425.5      0    211.45    0      0      0       0
    '2016-11-17'        '14:33:45.988'        '4CA623'             0      0       224    0      0      0       0
    '2016-11-17'        '14:33:45.988'        '4CA623'             0    446       200    0      0      0       0
    '2016-11-17'        '14:33:46.201'        '4CA623'        434.28      0    199.65    0      0      0       0
    '2016-11-17'        '14:33:46.727'        '4CA623'        434.28      0    199.65    0      0      0       0
    '2016-11-17'        '14:32:28.275'        '4CA73B'        424.65      0    211.52    0      0      0      64
 
los que cumplen condicion 2
    Fecha               Hora                  ICAO            GS        TAS    TT        LAT    LON    HDG    VR
    '2016-11-17'        '14:33:42.303'        '4CA623'        434.28    0      199.65    0      0      0      0
    '2016-11-17'        '14:33:42.935'        '4CA623'        434.28    0      199.65    0      0      0      0
    '2016-11-17'        '14:33:43.462'        '4CA623'        434.28    0      199.65    0      0      0      0
    '2016-11-17'        '14:33:43.988'        '4CA623'        434.28    0      199.65    0      0      0      0
    '2016-11-17'        '14:33:45.141'        '4CA623'        434.28    0      199.65    0      0      0      0
    '2016-11-17'        '14:33:45.672'        '4CA623'        434.28    0      199.65    0      0      0      0
    '2016-11-17'        '14:33:46.201'        '4CA623'        434.28    0      199.65    0      0      0      0
    '2016-11-17'        '14:33:46.727'        '4CA623'        434.28    0      199.65    0      0      0      0
 
solo los ICAO de los que cumplen la condicion 1
    '4CA623'
    '4CA73B'
    '4CA623'
    '4CA623'
    '4CA623'
    '4CA73B'
    '4CA623'
    '4CA623'
    '4CA73B'
    '4CA623'
    '4CA623'
    '4CA623'
    '4CA623'
    '4CA73B'
 
solo los ICAO de los que cumplen la condicion 1 (sin repetir)
    '4CA623'
    '4CA73B'
 
 
 
resultados2 =
 
         0         0         0         0         0         0         0
  434.2780         0  199.6450         0         0         0         0
         0         0         0   43.6355   -6.3454         0         0
  425.5030         0  211.4490         0         0         0         0
         0         0         0   43.6347   -6.3458         0         0
         0         0         0         0         0         0         0
  434.2780         0  199.6450         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0   43.4786   -5.8295         0         0
         0         0         0         0         0         0         0
  434.2780         0  199.6450         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0   43.6340   -6.3462         0         0
         0         0         0         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0   43.4773   -5.8307         0         0
  434.2780         0  199.6450         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0   43.4759   -5.8318         0         0
  425.5030         0  211.4490         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0   43.6309   -6.3477         0         0
         0         0         0         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0         0         0         0         0
  434.2780         0  199.6450         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0   43.6298   -6.3482         0         0
  434.2780         0  199.6450         0         0         0         0
  425.5030         0  211.4490         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0         0         0         0         0
         0         0         0         0         0         0         0
         0         0  224.0000         0         0         0         0
         0  446.0000  200.0000         0         0         0         0
  434.2780         0  199.6450         0         0         0         0
  434.2780         0  199.6450         0         0         0         0
         0         0         0         0         0         0         0
  424.6500         0  211.5190         0         0         0   64.0000
         0         0         0         0         0  209.0000         0




Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
programador en matlab
Servicios de programación 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
1
Comentar
sin imagen de perfil

Script Matlab + combinación vectores + trabajo con tabla

Publicado por Iván (9 intervenciones) el 03/12/2016 19:02:38
Buenas, es exactamente lo que buscaba, muchas 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
sin imagen de perfil

Script Matlab + combinación vectores + trabajo con tabla

Publicado por Iván (9 intervenciones) el 02/12/2016 04:44:46
Buenas Daniel, he conseguido aislar una columna y convertirla en formato string para utilizar varios scripts, pero sigo sin saber como convertir una columna del dataset a numérico o crear un nuevo vector con esas columnas que sea numérico. He utilizado el comando dataset2cell, me preguntaba si hay algún comando para pasar a numérico, he probado con dataset2mat pero no funciona.

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
Imágen de perfil de Daniel
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Script Matlab + combinación vectores + trabajo con tabla

Publicado por Daniel (264 intervenciones) el 02/12/2016 15:51:10
Ivan, los datos 'GS','TAS','TT','LAT','LON','HDG','VR' son numéricos, puedes hacer cualquier operación entre ellos. Los datos que son string son ICAO, que no tiene sentido que sea de otro tipo y fecha y hora. Si son fecha y hora los que necesitas utilizar reemplaza las lineas de la definicion de fecha y hora por estas

1
2
matriz{j+1,1}=datetime(line{1}); % fecha
matriz{j+1,2}=datetime(line{2}, 'Format', 'HH:mm:ss.SSS'); % hora

esto las pasará a datos de tiempo....

Si no es esto lo que necesitas hacer por favor sé mas claro respecto de las operaciones que deseas realizar, pon un ejemplo, etc

Saludos

Daniel
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

Script Matlab + combinación vectores + trabajo con tabla

Publicado por Iván (9 intervenciones) el 03/12/2016 19:45:51
Buenas Daniel, buscaba lo que está más arriba, ya que por alguna razón no me dejaba utilizarlos como números en si, por lo que debía crear otra tabla en formato numérico con cell2mat. Tras esto y con el código que me facilitaste he creado una matriz llamada "icaonumbers" cuyos datos son los valores ICAO, no repetidos, del documento, en este caso '4CA623' y '4CA73B'. Con esta matriz he implementado el siguiente código, con el fin de obtener las posiciones de las filas en las que se encuentran estos códigos ICAO.

1
2
3
4
5
6
A=cellstr(resultados(:,3));
icaonumbers=unique(A);
ICAONUMBER=dataset2cell(resultados(:,3));
for i=1:length(icaonumbers)
B{:,i} = nonzeros(cell2mat(cellfun(@(x,y)strfind(x,icaonumbers(i,1)).*y,ICAONUMBER,num2cell(1:length(ICAONUMBER)).','uni',false)));
end

Con esto genero un valor "B" que es 1x2 cell, en cuyo valor B{1,1} se encuentra un vector columna en formato numérico (33x1 double) y en cuyo valor B{1,2} se encuentra otro vector columna en formato numérico (13x1 double). Tras esto me imagino que el comando que buscaba para generar una tabla no era B{:,i}. Me preguntaba como hacer que directamente se genere una tabla "B", en cuyo valor B(1,1) se encuentra el vector columna 33x1 double y en cuyo valor B(1,2) se encuentre el vector columna 13x1 double, si es posible hacerlo. ¿Al ser los vectores de distinto tamaño está bien hecho como he escrito el código o puede generarse una tabla cuya primera columna sea 33x1 y la segunda 13x1.

Ejecuto este código ya que una vez hecho esto debo separar la tabla principal en dos, según el código ICAO que tengan, es decir, crear dos nuevas tablas, una con exclusivamente las filas que se encuentran en B{1,1} y otra con las filas que se encuentran en B{1,2}. Me preguntaba como podría hacer esto a partir de la tabla "resultados2" creada previamente. Lo que busco es una manera de convertirlo en bucle, ya que cuando trabaje con el documento real, aparecerán más de 20 códigos ICAO distintos, por lo que el vector "B" que busco generar será mucho mayor y esto implica que dividiré la tabla principal, es decir, "resultados2", en mas de 20 tablas distintas según los códigos ICAO. Con el código anterior obtengo las filas en las que se encuentra cada código ICAO, ahora, ¿Cómo podría con un bucle dividir la tabla "resultados2" en función de los valores obtenidos en el vector "B", es decir, crear una tabla con las posiciones de B(1,1) o en su defecto B{1,1}, otra con los valores de las filas que están en B(1,2) o B{1,2} y así sucesivamente hasta los 20 códigos ICAO que habría.

Adjunto con el post el archivo que contiene los valores de las filas en los que se encuentra por un lado el ICAO 4CA623 y por otro lado las filas en las que está el ICAO 4CA73B.

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
sin imagen de perfil

Script Matlab + combinación vectores + trabajo con tabla

Publicado por Iván (9 intervenciones) el 03/12/2016 22:03:38
Para concretar un poco más lo que busco con el bucle, diría que sería obtener una tabla llamada resultados1 del punto de la tabla B{1,1}, una tabla resultados2 del punto de la tabla B{1,2} y así sucesivamente hasta el último valor de B. Dado que en el punto B{1,1} se contienen las posiciones de las filas cuyo número ICAO es 4CA623, con estos valores obtendría la tabla resultados1, que contendría los datos numéricos del dataset, desde las filas 4 a 10, que en la columna 3 tienen como código ICAO 4CA623. Con esto entraría en el siguiente punto del script, en el que obtengo los datos necesarios para realizar los cálculos, este es tal que así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TAS=find(resultados(:,2)>0);
HDG=find(resultados(:,6)>0);
GS=find(resultados(:,1)>0);
TT=find(resultados(:,3)>0);
l=min(length(TAS),length(HDG));
TAS=TAS(1:l);
HDG=HDG(1:l);
GS1=zeros(1,l);
TT1=zeros(1,l);
for i=1:l
     [v,pos]=find(abs(TAS(i)-GS)==min(abs(TAS(i)-GS)));
     GS1(i)=GS(v(1));
end
for i=1:l
     [v,pos]=find(abs(HDG(i)-TT)==min(abs(HDG(i)-TT)));
     TT1(i)=TT(v(1));
end

Tras haber obtenido tablas cuya nomenclatura sería resultados1, resultados2, resultados20 (en caso de existir 20 códigos ICAO distintos), debería modificar el código anterior para que realizara un bucle con los datos y almacenara en casa paso del bucle, desde la primera iteración hasta la última, en este caso la 20, los datos HDG, TAS, GS1, TT1 (nomenclatura actual en el código). Es decir, obtener
1
2
3
4
5
6
7
8
9
TAS1=find(resultados1(:,2)>0);
HDG1=find(resultados1(:,6)>0);
GS1=find(resultados1(:,1)>0);
TT1=find(resultados1(:,3)>0);
l=min(length(TAS1),length(HDG1));
TAS1=TAS1(1:l);
HDG1=HDG1(1:l);
GS11=zeros(1,l);
TT11=zeros(1,l);
En la primera iteración ó vuelta del bucle, y en la segunda
1
2
3
4
5
6
7
8
9
TAS2=find(resultados2(:,2)>0);
HDG2=find(resultados2(:,6)>0);
GS2=find(resultados2(:,1)>0);
TT2=find(resultados2(:,3)>0);
l=min(length(TAS2),length(HDG2));
TAS2=TAS2(1:l);
HDG2=HDG2(1:l);
GS22=zeros(1,l);
TT22=zeros(1,l);
Pero no sé como realizar esto ya que no sé modificar la nomenclatura en función del valor de "i" o la constante que se utilice para el bucle. ¿Existe alguna manera de hacer esto? El código que he descrito solo realiza la búsqueda de los vectores útiles para los cálculos en una de las tablas y como el número de tablas varía según el documento de trabajo, necesitaría generar un bucle para que se realice todo de manera automática.
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