Matlab - pasar de I 10 a 10 veces I (IIIIIIIIII)

 
Vista:
sin imagen de perfil

pasar de I 10 a 10 veces I (IIIIIIIIII)

Publicado por Celia (6 intervenciones) el 16/01/2023 13:20:00
Hola, es mi primer mensaje pidiendo ayuda, aunque os he visitado en el pasado, ya que por mi trabajo utilizo MatLab y siempre que me encasquillo con mi código os visito.
Me preguntaba si me podíais ayudar con mi problema.

Tengo 3 eventos diferentes (I, C, S), y obtengo un Excel en el que me aparecen la ocurrencia de estos eventos y su duración, y yo necesitaría en listado las ocurrencias totales de los eventos.

Por ejemplo:

I 10 segundos
S 3 s
I 2 s
C 5 s

Y quisiera realizar un análisis de markov (para lo cual ya tengo el código funcional) de modo que para importar la cadena a analizar se incluyeran los eventos con las repeticiones, tal que así:

IIIIIIIIIISSSIICCCCC

No se como pasar de I 10 a 10 veces I (IIIIIIIIII).

Seguro que es fácil, pero yo no doy con ello.

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

pasar de I 10 a 10 veces I (IIIIIIIIII)

Publicado por Lindsey (119 intervenciones) el 20/01/2023 04:13:04
Tienes una muestra del archivo de excel?
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

pasar de I 10 a 10 veces I (IIIIIIIIII)

Publicado por Celia (6 intervenciones) el 20/01/2023 10:20:17
Muchas gracias por el interés en mi problema de MatLab.
Adjunto un Excel simplificado con datos.
Tengo 5 minutos por muestra, 300 segundos.
En una columna están las ocurrencias de los 3 estados (I, C, S), otras con la latencia, y duración de cada estado. Yo creo que la duración de cada estado es lo que necesito, pero a veces dudo si la latencia me ayudaría mejor para un código.
Necesito pasar eso a 300 eventos totales, 1 por segundo de los 5 minutos totales.
Hay algunos (pocos) en los que su duración es 0, porque ese evento ocurre menos de 1 segundo y, por tanto, necesito descartarlo, es decir, que cuando la duración de un evento es igual a 0 no aparezca en mi lista final de 300 eventos.
He estado intentando un código con control de bucle, pero no logro nada decente.
Agradezco mucho el interés y 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 Lindsey
Val: 419
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

pasar de I 10 a 10 veces I (IIIIIIIIII)

Publicado por Lindsey (119 intervenciones) el 21/01/2023 03:15:26
Hola,

Así lo he hecho, tal vez haya un modo mejor pero podrías servirte de guía.

1
2
3
4
5
6
7
8
9
10
11
Tabla_de_Excel=readtable('test  MatLab question.xls'); % para leer este archivo, tiene que estar en la misma carpeta donde estás trabajando, si no, hay que especificar todo el path
Eventos=table2cell(Tabla_de_Excel(2:end,1)); % De la primera columna agarro los elementos de la segunda fila hasta la última fila
Duraciones=table2array(Tabla_de_Excel(2:end,4)); % Similar a la línea anterior
 
Resultado=[];
 
for i =1:size(Eventos,1)
    if Duraciones(i)~=0 % Aquí se coloca la condición para que no considere los 0s
    Resultado = strcat(Resultado,repmat(Eventos{i},[1,Duraciones(i)]));
    end
end

El resultado que obtuve no tenía necesariamente 300 elementos, si no 298, porque hubo 2 eventos que pasaron 0 veces y no se incluyeron
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

pasar de I 10 a 10 veces I (IIIIIIIIII)

Publicado por Celia (6 intervenciones) el 21/01/2023 13:38:09
Muchas gracias!!!
Si! Eso es perfecto!
En serio, no se como agradecer tu ayuda, ahora por fin puedo seguir avanzando, que me había quedado estancada.

Mil Gracias de nuevo!!!
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
Imágen de perfil de Richtofen

pasar de I 10 a 10 veces I (IIIIIIIIII)

Publicado por Richtofen (20 intervenciones) el 22/01/2023 13:43:35
repmat no sería mejor?
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

pasar de I 10 a 10 veces I (IIIIIIIIII)

Publicado por C (6 intervenciones) el 23/01/2023 09:31:32
Muchas gracias por la sugerencia.
La verdad es que lo poco que se de la funcion repmat es en relación con matrices, por eso nunca lo tuve en cuenta para este problema concreto, ya que mis datos no son matrices, no?
De todas formas lo voy a mirar con detalle, quizás hay algún modo de hacerlo también usando repmat.
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 Richtofen

pasar de I 10 a 10 veces I (IIIIIIIIII)

Publicado por Richtofen (20 intervenciones) el 23/01/2023 17:10:12
Aunque ya te han dado la solución te propongo otra con código más sencillo que te lo concatena todo en el mismo char.

1
2
3
4
5
6
7
8
9
% Leo datos
data = readtable('test.xls');  % Renombrado por comodidad
% Array de string donde ir concantenando el resultado
res = '';
% Itero
for i=2:length(data.x_BehaviorName_)
    tmp = repmat( char(data.x_BehaviorName_(i)), 1, data.duration_s_(i) );
    res = strcat(res, tmp); % Sobreescribe res para no tener cosas raras!
end

Igual ese tipo de dato te vale, si no ya ves tu como separarlo o leer poco a poco, depende de tu aplicación
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

pasar de I 10 a 10 veces I (IIIIIIIIII)

Publicado por C (6 intervenciones) el 25/01/2023 17:24:28
Ah, pues como dices parece más directo, si. Voy a intentarlo también.
Muchas gracias por tu 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