Errore nel riempimento di un array in Matlab

di il
1 risposte

Errore nel riempimento di un array in Matlab

Salve,
ho la necessità di eseguire una simile operazione in Matlab:

for i=0.1:0.1:360
j(i*10)=2; % 2 è un valore fittizio
end

Ma mi viene restituito quest'errore:

??? Attempted to access j(3); index must be a positive integer or
logical.

Potreste spiegarmi il motivo?
Grazie anticipatamente
Thomas

1 Risposte

  • Re: Errore nel riempimento di un array in Matlab

    La domanda è molto "datata", ma la risposta potrebbe essere utile a qualcuno.

    Il problema nasce dall'utilizzo di numeri "double" come indici all'interno di un loop e, soprattutto, come indici per accedere agli elementi di un vettore, come nell'istruzione

    j(i*10)=2;

    Anche se nell'istruzione il valore dell'indice "i" viene moltiplicato per 10, rimane sempre un numero di tipo "double".

    Nello specifico l'errore consiste nel calcolo che genera la sequenza "i=0.1:0.1:360" e, successivamente nella moltiplicazione degli stessi per "10".
    Nel caso

    i=0.3

    si vuole accedere accedere al terzo elemento del vettore "j" tramite l'istruzione

    j(1*10)

    aspettandosi che "i*10" (con i=0.3) faccia "3".
    Purtroppo così non è.

    Se si imposta il "format" come "format longeng" e si esegue la differenza tra il valore di "i" (0.3) moltiplicato per "10" ed il numero "3", invece di "0", si ottiene come risultato

    444.089209850063e-018

    questo perchè, in realtà il valore di i(3) non è esattamente "0.3".

    In realtà, il problema si riscontra anche per altri valori di "i".

    Per risolvere il problema bisogna definire i valori dell'indice del loop come interi, nel caso, all'interno del loop servissero i valori "0.1:0.1:360" si può definire un vettore, prima del loop, che li contenga.

    La soluzione proposta è stata implementata nello script che segue.
    
    % 
    % Loop originale
    % 
    for i=0.1:0.1:360
       j(i*10)=2; % 2 è un valore fittizio
    end
    % 
    % Definizione del vettore "i_idx": contiene i valori che, nel loop
    % originale erano assunti dalla varaibile "i"; questo vettore può essere
    % usato all'interno del loop modificato nel caso servisse
    % 
    i_idx=0.1:0.1:360;
    % 
    % Definizione modificata del loop
    % 
    for i=1:3600
       j(i)=2; % 2 è un valore fittizio
    %    
    %    Esempio di utilizzo dei valori del vettore "i_idx" definiti come
    %    indice del loop nell'implementazione originale
    %    
       a=sin(i_idx*180/pi);
    end
    
    Di seguito, lo script che permette di visualizzare l'errore di arrotondamento.
    
    format
    i=0.1:0.1:360;
    
    i(3)
    i(3)*10
    format longeng
    
    i(3)
    i(3)*10
    i(3)*10-3
    
    int_idx=1:3600;
    i=0.1:0.1:360;
    
    differenza=(i*10)-int_idx;
    
    format
    
    % indici di "i" per i quali si verifica l'errore
    bad_idx=find(differenza ~= 0.0);
    
    
    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
1 risposte