Elaborazione vettori

di il
1 risposte

Elaborazione vettori

Ciao a tutti,
quello che vorrei è molto semplice da dire, ma non da fare:

se ho un vettore del tipo A=(1,1,3,0,0,0,0,4,4,6,5,6,0,0,0,0,0,0,0,4,2,2) io vorrei spezzarlo in vettori più piccoli che contengano solo le part senza zeri, cioè cosi:
A1=(1,1,3) A2=(4,4,6,5,6) A3=(4,2,2)

è possibili secondo voi?
ho provato a fare qualche ciclo ma non riesco a capire il modo furbo per farlo

1 Risposte

  • Re: Elaborazione vettori

    Una possibile soluzione può utilizzare la funzione "eval" per creare automaticamente, all'interno di un "ciclo for", i vettori nei quali si vuole dividere il vettore originale.
    
    A=[1,1,3,0,0,0,0,4,4,6,5,6,0,0,0,0,0,0,0,4,2,2];
    n=length(A);
    %
    % Contatore vettori nei quali viene suddiviso il vettore A
    %
    cnt=1;
    %
    % Contatore elementi dei vettori nei quali viene suddiviso il vettore A
    %
    j=1;
    %
    % Creazione primo vettore
    % I vettori nei quali il vettore A viene diviso vengono chiamati "A_x" dove
    % "x" è il numero progressivo ==> A_1, A_2, ... A_n
    %
    eval(['A_' num2str(cnt) '=[];']);
    %
    % Loop su tutti gli elemento del vettore A
    for i=1:n
    %  Se lo i-esimo elemento di A è diverso da 0 viene inserito nel vettore
    %  corrente ed il contatore degli elementi viene incrementato
    %
       if(A(i) ~= 0)
          eval(['A_' num2str(cnt) '(' num2str(j) ')= A(' num2str(i) ');'])
          j=j+1;
       else
    %  Se lo i-esimo elemento di A è uguale a 0 viene scartato, il contatore
    %  dei vettori viene incrementato e viene creato un nuovo vttore. Il
    %  controllo sul contatore j viene utilizzato per non creare un nuovo
    %  vettore nel caso in A ci siano 2 o più 0 consecurtivi
    %
          if(j ~= 1)
             cnt=cnt+1;
             eval(['A_' num2str(cnt) '=[];'])
          end
          j=1;
       end
    end
    %
    % Nel caso il vettore A termini con uno o più 0, l'ultimo vettore creato
    % viene cancellato in quanto risulta vuoto ed il contatore viene
    % decrementato di 1
    %
    eval(['if(isempty(A_' num2str(cnt) ')), clear A_' num2str(cnt) ';cnt=cnt-1;end'])
    %
    % Al termine dello script vengono visualizzati il vettore A ed i vettori
    % nei quali è stato diviso
    %
    A
    for i=1:cnt
       eval(['A_' num2str(i)])
    end
    
    
    Il vettore "A" viene quindi suddiviso nei tre vettori "A_1, A_2, A_3"
    
    
    A =
      Columns 1 through 12
         1     1     3     0     0     0     0     4     4     6     5     6
      Columns 13 through 22
    
         0     0     0     0     0     0     0     4     2     2
    A_1 =
         1     1     3
    A_2 =
         4     4     6     5     6
    A_3 =
         4     2     2
    
    Hope this helps
Devi accedere o registrarti per scrivere nel forum
1 risposte