Il ciclo for va in loop infinito

di il
1 risposte

Il ciclo for va in loop infinito

Buongiorno a tutti
Sono una studentessa di ingegneria biomedica e sto svolgendo un tirocinio presso un istituto di ricerca.
Mi è stato chiesto di ottimizzare e correggere un codice in matlab (R2018a), ma da due settimane a questa parte non riesco a risolvere un problema. Il ciclo for che ho riportato sotto dovrebbe creare (fra le altre cose) questi 6 arrays: ydata_low_1, ydata_low_2, ydata_low_3, ydata_high_1, ydata_high_2 e ydata_high_3.

Ciascuno di questi array ha m righe e t colonne.
Se k = 1 allora m = 3121
se k = 2 allora m = 3554
se k = 3 allora m = 3510

Gli array "low" hanno 5 colonne (da Ik_0 a Ik_4) mentre gli array "high" hanno 4 colonne (da Ik_5 a Ik_8).
I vettori Ik_t fanno parte della struct I_vars.
for k = 1 : num_int
    
    I_vars_list = who('-regexp',['I' num2str(k) '_\d+$']);
    tmp_file = [tempname '.mat'];
    save(tmp_file,I_vars_list{:});
    I_vars = load(tmp_file);
    var_names = fieldnames(I_vars);
    n_vars = length(var_names)-1;
    
    eval(['m = length(I',num2str(k),')'])
    
    for i = 1 : m
        for t = 0:4
            ydata_low(t+1,:) = I_vars.(['I' num2str(k) '_' num2str(t)]);
            ydata_l = ydata_low';
            eval(['ydata_low_', num2str(k),'= ydata_l']);
            eval(['xdata_',num2str(k),' = bvalues_',num2str(k),'(1:5)']);
        end
        for t = 5:8
            ydata_high(t-4,:) = I_vars.(['I' num2str(k) '_' num2str(t)]);
            ydata_h = ydata_high';
            eval(['ydata_high_', num2str(k),'= ydata_h']);
            eval(['xdata1_',num2str(k),' = bvalues_',num2str(k),'(6:9)']);
        end
    end
end

eval(['ydata_low_',num2str(k),'(~isfinite(ydata_low_',num2str(k),'))=0']);
eval(['ydata_high_',num2str(k),'(~isfinite(ydata_high_',num2str(k),'))=0']);
Quando eseguo il codice, vengono creati solo ydata_low_1 e ydata_high_1, poi il codice entra in un loop infinito e sono costretta a bloccarlo.
Grazie a chi mi aiuterà

1 Risposte

  • Re: Il ciclo for va in loop infinito

    La tua domanda "somiglia" molto a quella che SARAC96 ha pubblicato 4 mesi fa:

    https://www.iprogrammatori.it/forum-programmazione/matlab-simulink/operazioni-sugli-indici-t34924.html

    Stiamo parlando della stessa cosa?

    E' la stessa domanda?

    In che cosa sarebbe diversa?

    Mi sembra che le risposte fornite siano più che sufficienti.

    Ha provato con il debugger?

    Tra le tante cosa, considera che Il loop con indice "i" (for i = 1 : m) che contiene gli altri due loop con indice "t" effettua, come hai scritto, 3121 iterazioni per "k=1", 3554 iterazioni per "k=2", ecc.
    Se hai pubblicato tutto il codice, l'indice "i" non vene usato nei loop interni (quelli con indice "t"): questo vuol dire che, per esempio per "k=1" questi loop vengono eseguiti 3121 senza che ci sia alcuna differenza tra le iterazioni del loop con "i".
    In pratica, il vettore "ydata_low_1" viene creato 3121 volte, sempre con gli stessi valori.

    Dovresti rivedere al logica dei loop.

    Per quanto riguarda l'ottimizzazione la prima cosa da fare è, mi dispiace dirtelo, riscrivere completamente il codice rivedendone l'impostazione, così come era stato suggerito nelle risposte alla domanda sopra citata.

    In tutto il codice usi la funzione "eval".
    Non c'è cosa peggiore che si posa fare.
Devi accedere o registrarti per scrivere nel forum
1 risposte