Matlab - cuánto se tarda en volver de un fragmento de estados I a otro I

 
Vista:
sin imagen de perfil

cuánto se tarda en volver de un fragmento de estados I a otro I

Publicado por C (6 intervenciones) el 27/01/2023 13:19:48
Hola, ahora que he roto el hielo, y perdido la vergüenza de preguntar, vuelvo con un nuevo problema, a ver si tengo tanta suerte como la otra vez (muchas gracias, de nuevo, a la gran ayuda que me disteis).

Mi problema deriva un poco de lo obtenido antes con las cadenas de 3 estados, una vez que tengo la secuencia de estados con la que hacer la cadena de markov, necesitaría dividir los estados entre I y no I (C y S, juntos). y saber cuánto se tarda en volver de un fragmento de estados I a otro I.
ie ‘IIICCSCCCI’ 6 times/seconds from island of I to new island of I's (ejemplo muy simplificado para explicarme).

De cada cadena necesitaría saber los fragmentos de solo no I (C y S, llamado no islas para su simplificacion) y solo I (llamado islas), contar su frecuencia (o número de islas y no islas), así como su duración individual (de las islas individuales, no la duracion total de todas las islas juntas).

Pongo ejemplo con un fragmento discreto para simplificación, y ejemplo de los resultados que necesitaria poder obtener:

%Given a sequence R = 'IIIICCSCCCIIIIIIIICCCIIIIIICCIIIICCIIICIIISIICII'
% trying to get the number of individual no I fragments (called no islands), duration of individual no islands, number of islands (only I states), duration etc.
The results for the example given:
%startindex_endindex_Duration no islands
% 5_10_6
% 19_21_3
% 28_29_2
% 34_35_2
% 39_39_1
% 43_43_1
% 46_46_1
%number (frequency?) of no islands: 7

%the same for islands (I), starindex, endindex, duration of individual islands

ese ejemplo es uno de cadena muy corta para, al ir contando poder explicarme mejor los resultados que busco.

ahora pongo un ejemplo y loq ue he empezado a hacer.


1
2
3
4
5
6
7
8
9
10
11
R = 'IIIICCSCCCIIIIIIIICCCIIIIIICCIIIICCIIICIIISIIC'
 
RR=abs(R(:))=='I' %to get sequence of 0 and 1, being the 0 the ones to count number of no islands and duration of individual no islands etc
%*** He pensado que al ser 3 estados pero solo necesitar diferenciar las islas (I) y las no islas (C y S), entre I y los %otros 2 estados, si lo paso a binario (1 para I, 0 para C +S) podria simplificarme el codigo***
 
startindex=find(RR<1)
endindex=find(RR>=1)-1
 
indices=zeros(1,max(endindex)+1)
 
duration= endindex-startindex+1

como veis, asi me salen los starindex:
5
6
7
8
9
10
19
20
21
28
29
34
35
39
43
46

que no es del todo incorrecto, aunque no exactaemnte loq ue necesito... ya que la primera isla si empieza en el segundo 5, y termina en el 10, el segundo entre el 19 y el 21, y asi, pero me salen listados.

el endindex en loq eu me sale mal, y no me termino de centrar en que poder cambiar o mejorar para finalmente obtener algo parecido a loq ue ponia al prinicpio.

0
1
2
3
10
11
12
13
14
15
16
17
21
22
23
24
25
26
29
30
31
32
35
36
37
39
40
41
43
44


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

cuánto se tarda en volver de un fragmento de estados I a otro I

Publicado por Richtofen (20 intervenciones) el 29/01/2023 21:49:06
Estás haciendo básicmente un detector de secuencias solo que tu input es no binaria, entonces tienes que hacer una serie de comprobaciones extra, pero tu problema se resuelve con una máquina de estados, que serian el estado inicial, y comprobar si pasas a una isla o no, así defines dos estados nuevos, de isla a isla o de isla a no isla, y para cada uno defines dos estados nuevos, si estas en isla y sigues en isla, si estas en isla y pasas a no isla (sin estar en estado posterior al inicial), y si estas en no isla y pasas a no isla o vuelves a isla. Cada uno activará los flags y contadores que consideres oportunos.

En matlab (aunque muy poco optmizado), sería algo así (solo he hecho la parte de las islas)

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
close all
clear vars
clc
 
R = 'IIIICCSCCCIIIIIIIICCCIIIIIICCIIIICCIIICIIISIICII';
 
is_island = false;
no_island_freq = 0;
num_island = 0;
index_list = [];
 
for i=1:length(R)
    if i==1
        % Initial case
        if R(i) == 'I'
            is_island = true;
            num_island = num_island + 1;
            index_list = [index_list, i];
        end
    else
        % Rest
        if R(i) == 'I'
            if is_island
                % Continue in an island
 
            else
                % New island
                is_island = true;
                num_island = num_island + 1;
                index_list = [index_list, i];
            end
        else
            % Non in an island
            is_island = false;
            if R(i-1) == 'I'
                % End of previous island
                index_list = [index_list, i-1];
            end
        end
    end
end
% Check if ending in island
if is_island
    index_list = [index_list, i];
end
 
 
% Total number of islands
fprintf('Total number of islands: %i\n',num_island)
% Data for each island
tmp = diff(index_list);
len_each_island = tmp(1:2:end) + 1;
 
 
% Show data
for i=1:length(len_each_island)
    % Format: StartIndex_EndIndex_Duration
    s = index_list( 2*(i-1) + 1 );  % Current island start index
    e = index_list( 2*(i-1) + 2 );  % Current island end index
    fprintf("Island [%i]: %i_%i_%i \n",i,s,e,len_each_island(i));
end

Para que veas las condiciones en cada estado y como moverse. Usalo como esqueleto pero revisalo por si hay algun bug o un caso que no he contemplado. Espero que te ayude
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