Errore Index in position 1 exceeds array bounds in creazione nuova matrice

di il
3 risposte

Errore Index in position 1 exceeds array bounds in creazione nuova matrice

Ciao sto cercando di generare una matrice che dovrebbe essere cosi strutturata. In pratica io ho due zone definite utilizzando la funzione polyshape. Mi serviva sapere i punti che una di queste contiene al suo interno e sul bordo. Ho pensato quindi di crearmi una matrice chiamata m di n righe 2 colonne dove memorizzo tutte le coordinate della prima figura (un quadrato) e utilizzando la funzione inpolygon con i vertici della seconda figura ottengo un vettore che ho chiamato found costituito da valori logici.
A questo punto la mia idea era quella di scorrere questo vettore found e se il valore j-esimo fosse stato =1 salvarmi in una nuova matrice chiamata mat le coordinate del punto (x,y).
Con questo metodo tuttavia mi salva diverse righe anche con 0 0 quindi non trovando altra soluzione pensavo di scorrere questa nuova matrice e farmi cancellare le righe con gli zeri. la dimensione della matrice effettivamente diminuisce e da 10201 righe passa a 5639 ma in realtà ne lascia ancora molte con gli zeri e mi visualizza il seguente messaggio di errore: Index in position 1 exceeds array bounds (must not exceed 5639).
Ho utilizzato la variabile cont per capire quante righe dovrebbe avere mat e sono 1126.
Credo che l'idea che ho avuto oltre a darmi questo errore sia anche poco efficiente.
Mi sapreste dire dove sbaglio o in alternativa un consiglio su una possibile nuova soluzione del problema?
Allego codice

q = polyshape([-0.5 0.5 0.5 -0.5],[-0.5 -0.5 0.5 0.5]);
plot(q,'FaceColor','white','FaceAlpha' , 0.1)
dist1 = 0.15;
dist2 = 0.87;
xx_u=[0 0];
hold on
t1= polyshape({[xx_u(1)-dist2 xx_u(1) xx_u(1)+dist2]},{[xx_u(2)+dist1 xx_u(2) xx_u(2)+dist1]});
t2= intersect(q,t1) ;
plot(t)

t=-0.5:0.01:0.5;

% Creo matrice con tutte le coordinate del quadrato
n_col=2;
n=length(t);
y1=repmat(t,n^0,n^(n_col-1));
y1=y1(:);
x1=repmat(t,n^1,n^(n_col-2));
x1=x1(:);
m=[x1 y1];


found= inpolygon(m(:,1),m(:,2),t2.Vertices(:,1),t2.Vertices(:,2));
mat=zeros(10201,2);
cont=0;
for j=1:length(found)  
    if found(j)==1
        mat(j,:)=[m(j,1) m(j,2)];
        cont=cont+1; 
    end
end

for i=1:length(mat)
    if (mat(i,1)==0 && mat(i,2)==0)
        mat(i,:)=[];
    end
end

Grazie

3 Risposte

  • Re: Errore Index in position 1 exceeds array bounds in creazione nuova matrice

    Al momento non ho accesso a MatLab per verificare il codice che hai pubblicato (tra l'altro, la struttura "area_safe" non è definita, per cui, è impossibile eseguire il codice), tuttavia, ammesso che la parte iniziale del codice funzioni correttamente, c'è un errore concettuale nel primo loop:
    
    cont=0;
    for j=1:length(found)  
        if found(j)==1
            mat(j,:)=[m(j,1) m(j,2)];
            cont=cont+1; 
        end
    end
    
    In questo loop usi la variabile "j" per identificare la posizione nella quale salvare i valori della matrice "m" quando "found(j) == 1".
    L'errore consiste nel fatto che j" viene incrementata ad ogni iterazione.
    Se, ad esempio i primo tre elementi del vettore "found" sono "1 0 1" cosa succede?

    [*] alla prima iterazione i valori di "m" vengono salvati correttamente in "mat"
    [*] alla seconda iterazione, found(j) è "0" perciò i valori di "m" non vengono assegnati a "mat"
    [*] alla terza iterazione, found(j) è 1 perciò i valori di "m" vengono assegnati a "m", sì, ma "dove"? Nella riga "j", visto che hai scritto: mat(j,:)=[m(j,1) m(j,2)]: e "j" vale "3" questo implica che la riga 2 conserva i valori "0" con i quali hai inizializzato la matrice stessa (la stessa cosa succederebbe anche se non inizializzassi la matrice "mat" perchè MatLab assignerebbe alla riga 2 i valori "0".

    La soluzione è semplice: usa la variabile "cont" come indice per specificare in quale riga di "mat" inserire i valori della matrice "m":
    
    cont=0;
    for j=1:length(found)  
        if found(j)==1
    %        mat(j,:)=[m(j,1) m(j,2)];
            cont=cont+1; 
            mat(cont,:)=[m(j,1) m(j,2)];
        end
    end
    
  • Re: Errore Index in position 1 exceeds array bounds in creazione nuova matrice

    Proveró a fare quanto da te suggerito! Intanto ho modificato il codice effettivamente nel trascrivere qui il codice cercando di dare nomi più semplici avevo commesso un errore nel rinominare alcune variabili.
  • Re: Errore Index in position 1 exceeds array bounds in creazione nuova matrice

    Per quanto riguarda l'errore nel secondo loop (che non dovrebbe essere più necessario, se la correzione del primo loop ha effetto), il problema consiste nel fatto che cancellando le righe della matrice "m" all'interno di un loop, la dimensione della matrice, ovviamente, cambia ogni volta che una riga viene cancellata.
    Il loop però è impostato per eseguire tante iterazioni quanto quanto era il numero iniziale di righe della matrice; questo comporta che, dopo aver cancellato "un po'" di righe, il codice cerca di accedere a locazioni che superano la dimensione attuale della matrice.

    Nel caso ti serva cancellare delle righe da una matrice, devi prima trovare tutti gli indice delle righe da cancellare e poi cancellarle tutte assieme.
    Questo è un esempio:
    
    % Definizinoe di una matrice di input
    m=randi([0 2],33,2)
    
    %
    % QUESTO METODI PER LA CANCELLAZIONE DA' ERRORE
    %
    %for i=1:33
    %   if(m(i,1) == 0 && m(i,2) == 0)
    %      m(i,:)=[];
    %   end
    %end
    
    % Ricerca degli indici dele righe che contengono "0" in entrambe el colonne
    idx=find(m(:,1) == 0 & m(:,2) == 0)
    % Cancellazione delle righe
    m(idx,:)=[]
    
Devi accedere o registrarti per scrivere nel forum
3 risposte