Ottimizzazione codice

di il
1 risposte

Ottimizzazione codice

Ciao a tutti, sono nuovo del codice e vi chiedo aiuto per ottimizzare il programma che ho appena scritto (e anche risolvere un problema che non capisco).

In pratica devo leggere un file.txt con più di 10000 righe di dati scritti in formato simil-NMEA:
$MVUP,65754,4522330,N,1228399,E,0.13,K,29,C,85.00,G,-0.28,1.07,83.61,RPY,0.00,WS,0.00,0.00,WD,0.00,0.00,L
Queste sono le righe di codice che ho scritto e che funzionano a parte un piccolo errore 'ininfluente':
file_name = input ('Inserisci il nome del file: ','s');
file_id = fopen(file_name);
contenuto = fscanf(file_id, '%s');

fclose(file_id);
[date,contenuto]=strtok(contenuto, '-');
[temp,contenuto]=strtok(contenuto, '>');
i=1;
[temp,contenuto]=strtok(contenuto, '$');
while (contenuto)

[type,contenuto]=strtok(contenuto, ',');
[temp,contenuto]=strtok(contenuto, ',');
time(i)= str2double (temp);
[temp,contenuto]=strtok(contenuto, ',');
lat(i)= str2double (temp);
[temp,contenuto]=strtok(contenuto, ',');
[temp,contenuto]=strtok(contenuto, ',');
lon(i)= str2double (temp);
[temp,contenuto]=strtok(contenuto, ',');
[temp,contenuto]=strtok(contenuto, ',');
vel(i)= str2double (temp);
[temp,contenuto]=strtok(contenuto, ',');
[temp,contenuto]=strtok(contenuto, ',');
dir(i)= str2double (temp);
[temp,contenuto]=strtok(contenuto, ',');
[temp,contenuto]=strtok(contenuto, ',');
temperature(i)= str2double (temp);
[temp,contenuto]=strtok(contenuto, ',');
[temp,contenuto]=strtok(contenuto, ',');
roll(i)= str2double (temp);
[temp,contenuto]=strtok(contenuto, ',');
pitch(i)= str2double (temp);
[temp,contenuto]=strtok(contenuto, ',');
yaw(i)= str2double (temp);
[temp,contenuto]=strtok(contenuto, ',');
[temp,contenuto]=strtok(contenuto, ',');
ws(i)= str2double (temp);
[temp,contenuto]=strtok(contenuto, ',');
[temp,contenuto]=strtok(contenuto, ',');
wd_1(i)= str2double (temp);
[temp,contenuto]=strtok(contenuto, ',');
wd_2(i)= str2double (temp);
[temp,contenuto]=strtok(contenuto, ',');
[temp,contenuto]=strtok(contenuto, ',');
right(i)= str2double (temp);
[temp,contenuto]=strtok(contenuto, ',');
left(i)= str2double (temp);
[temp,contenuto]=strtok(contenuto, '$');

i=i+1;
end
L'errore è che se lo faccio partire dalla console scrivendo il nome del file con il codice e poi immettendo il nome del txt non va dando l'errore seguente, se invece lo faccio partire con il 'play' dal text editor di matlab funziona.
??? Attempt to reference field of non-structure
array.
Il codice comunque produce il risultato voluto.

ECCO ORA LA MIA RICHIESTA:

quando leggo qualche centinaio di dati va tutto bene, ma quando salgo sopra i mille il computer si impianta per diverso tempo (non sono mai arrivato a vedere quanto ci mette con 17000 righe). Vorrei sapere se c'è un modo per ottimizzare quel codice o se l'unica soluzione (ma non penso di essere stato così bravo al primo colpo) è quella di spezzettare il file.

1 Risposte

  • Re: Ottimizzazione codice

    Se, come sembra, la porzione di script riportata serve solo ad estrarre il contenuto delle varie righe del file di input e di assegnarlo ad opportuni vettori, per velocizzare il processo si può procedere in maniera radicalmente alternativa.
    Si può, infatti, utilizzare un altro linguaggio di programmazione (AWK, Perl, Pyton, ...) per "leggere" il file, memorizzare i dati di interesse all'interno di variabili (vettori, matrici) e, quindi, stamparli su file di output.
    Il "trucco" consiste nella formattazione del contenuto dei files così generati.
    Se, per esempio, dal file di testo in input sono stati estratti i valori contenuti nelle prime due colonne e, questi valori corrispondo a delle coordinate ("x" e "y"), si può fare in modo che il programma scriva il file di output in questo modo:

    xy=[
    valore_x1 valore_y1
    valore_x2 valore_y2
    ...
    valore_xn valore_yn
    ];

    Se a questo file di output viene assegnata l'estensione ".m", esso potrà essere "chiamato" direttamente da uno script MatLab e la matrice "xy" sarà caricata nel workspace.

    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
1 risposte