CREARE UNA NUOVA MATRICE

di il
3 risposte

CREARE UNA NUOVA MATRICE

Buongiorno a tutti; sono nuovo del forum e non molto pratico del linguaggio di programmazione matlab.
Io ho un file excel che carico su matlab attraverso la funzione [COD ID] = xlsread('Cod_ID.xlsx') [ID] è formata da solo numeri mentre [COD] da stringhe e ho un vettore A formato da sole stringhe. Io devo confrontare elemento per elemento le stringhe della mia colonna COD con quelle del vettore A e se corrispondo devo aggiungere ad A una colonna al cui interno è presente il valore di ID corrispondete.
Ho provato a scrivere questo codice ma quando lo eseguo mi da questo errore Index exceeds matrix dimensions
dove sbaglio?

i = 1;
j=1;
DATI= zeros(length(A),2);
for i = 1 : length (A) 
    for j = 1 : length (COD) 
    x = strcmp ( A(i) , COD(j));
    if ( x == 1) 
        DATI (i)  = [A(i) ID(j)];
        i= i+1;
        i=j+1;
    else
        i=j+1;
        i= i+1;
     end 
    end
end
DATI

3 Risposte

  • Re: CREARE UNA NUOVA MATRICE

    In quale riga del codice viene segnalato il messaggio di errore?
    Il messaggio di errore è molto chiaro: in qualche punto, il codice "cerca di accedere ad una locazione di uno dei vettori (A, COD, DATI) superiore alle dimensioni del vettore stesso; in pratica se, per esempio, se la dimensione di A è 10, si cerca di accedere ad A(11).

    Hai provato a verificare i valori assunti dalle variabili con il begugger?

    Cosa contiene "A"? E' vettore di stringhe o di caratteri?
    Un "vettore di stringhe" non ha molto senso, a meno che non si consideri ogni carattere una stringa.

    La variabile "indice" del vettore esterno ("i") viene incrementata nella sezione "if" del ciclo for interno il che non ha senso, "i" viene incrementata automaticamente ad ogni iterazione del ciclo for.
  • Re: CREARE UNA NUOVA MATRICE

    Ho ricreato lo script perchè mi son reso conto che non aveva molto senso.
    [ID COD] = xlsread( 'Cod_ID.xlsx');
    dati = textread('dati.txt', '%s');
    
    i=1;
    j=1;
    
    Finale = zeros (length(dati), 2);
    
    for j = 1 : length(ID)
        for i = 1 : length(dati)
            x = strcmp ( dati(i,1) , COD (j,1)); 
            if ( x == 1 )
                Finale (i,:) = { dati(i,1) ID(j,1)}
                i=i+1;
            else 
                j=j+1;
            end
        end
    end
    Finale
    
    in questo caso l'errore che mi da è il seguente
    Conversion to double from cell is not possible.
    Error in Untitled2 (line 13)
    Finale (i,:) = { dati(i,1) ID(j,1)}

    andando ad indagare le classi delle variabili con il comando whos matlab mi dice che: ID è double mentre COD e dati sono cell.

    I dati che ho all'interno di dati sono del seguente tipo
    'ARTSO'
    'ARTSO'
    'ARTSO'
    'ARTSO'
    'ARTSO'
    'ARTSO'
    'ARTSO'
    'AYACH'
    'AYACH'
    'AYACH'
    'AYACH'
    'AYACH'

    mentre quelli di ID COD
    1 'AGOMO'
    2 'AGONO'
    3 'ANZMA'
    4 ' ARTSO'
    5 'AYACH'
    6 'BANPO'

    in pratica devo andare a verificare se COD corrisponde a dati devo associare a dati il suo ID e dovrei ottenere questo

    'ARTSO' 4
    'ARTSO' 4
    'ARTSO' 4
    'ARTSO' 4
    'ARTSO' 4
    'ARTSO' 4
    'ARTSO' 4
    'AYACH' 5
    'AYACH' 5
    'AYACH' 5
    'AYACH' 5
    'AYACH' 5
  • Re: CREARE UNA NUOVA MATRICE

    Di nuovo, il messaggio di errore sembra chiaro, se "COD" e "dati" sono cellarray, anche "Finale" deve essere un cellarray.
    Non puoi inizializzarlo come una matrice di double (con la funzione "zeros").

    Hai dato un'occhiata alla documentazione relativa all'utilizzo dei cellarray?

    https://it.mathworks.com/help/matlab/matlab_prog/access-data-in-a-cell-array.html
Devi accedere o registrarti per scrivere nel forum
3 risposte