Creazione Struct da vettore

di il
2 risposte

Creazione Struct da vettore

Ciao a tutti,
mi servirebbe creare uno struct partendo da questo vettore SS, in cui in ogni field sia contenuta una sequenza di numeri consecutivi fino al primo zero.
così che lo struct risulti:
struct.field1= [ 64 65 66 67 68 0 85 86 87 ]
struct.field2=[97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116]
...
e così via fino alla fine dell'array.
come posso farlo ipotizzando di non conoscere né la lunghezza dell'array stesso o della posizione delle sequenze dentro a questo?

SS = [ 64    65    66    67    68     0    85    86    87     0    90     0     0     0    97    98    99   100   101   102    103   104   105   106   107   108   109   110   111   112   113   114   115   116     0   119   120   121   122   123   124     0   127   128     0   145   146   147   148   149   150   151     0   154   155   156     0   159   160   161 162   163     0   166   167   168   169   170   171   172     0     0   303     0   312     0   315   316   317   318     0   321     0   324   325   326   327   328   329   330   331   332   333   334   335   336   337   338     0   352    353     0   403   404   405   406   407   408   409   410   411   412   413     0   475   476   477   478   479   480  481   482   483   484   485     0   601   602     0   605     0   609   610     0   706   707   708   709   710   711    712   713   714   715   716   717   718     0     0   724   725   726   727   728     0];
Grazie

2 Risposte

  • Re: Creazione Struct da vettore

    
    SS_Struct=struct;
    cycle=1;
    SS_new=[];
      for ask=1:length(SS)-1
        if SS(ask+1)==SS(ask)+1
            SS_new(ask)=SS(ask);
        elseif SS(ask+1)~=SS(ask)+1
              SS_Struct=setfield(SS_Struct,strcat('f',num2str(cycle)),SS_new');
              cycle=cycle+1;
        end
      end
    for cyc=1:numel(fieldnames(SS_Struct))
    cycle=strcat('f',num2str(cyc));
    [SS_Struct.(cycle)(1:max(find([SS_Struct.(cycle)]==0)))] = [];
    end
    clear SS_new
    
    Metto il codice che ho scritto io nel caso possa essere utile a qualcuno o nel caso qualcuno avesse suggerimenti per migliorarlo.
  • Re: Creazione Struct da vettore

    Il codice che hai pubblicato sembra non funzionare come ti aspetti.

    A parte il fatto che i campi della struttura vengono chiamati semplicemente "f1", "f2", "f3" ecc. e non "field1", "field2", "field3" ecc. sembra anche che generi dei campi duplicati, ad esempio "f13" ed "f14" contengono entrambi il valore "127" il quale, nel vettore di esempio che hai pubblicato non risulta essere un singolo valore tra uno po più "0".

    Se nel vettore di input i valori tra gli "0" sono già ordinati, puoi semplicemente memorizzare la posizione degli "0" con la funzione "find" e creare un loop che scandisca tale vettore, assegnando direttamente i valori del vettore compresi nei vari intervalli ai campi della struttura.
    Per gestire il caso di due o più "0" consecutivi, basta aggiungere un controllo sui dati estratti: se è "empty" vuol dire che sei in presenza di due "0" consecutivi e, quindi, non devo cerare un campo nella struttura.

    Una possibile implementazione potrebbe essere:
    
    % Inizializzazione contatore campi
    cnt=0;
    % Ricerca degli "0"
    z=find(SS == 0)
    % Verifica della prima serie di "0"
    tmp=SS(1:z(1)-1)
    % Se non ci sono "0" viene creato il primo campo della struttura
    if(~isempty(tmp))
       cnt=cnt+1;
       struct_00_.(['field' num2str(cnt)])=tmp
    end
    % Loop sui gruppi di valori delimitati dagli "0"
    for i=1:length(z)-1
       tmp=SS(z(i)+1:z(i+1)-1)
       % Se non ci sono "0" viene creato l'1-esimo campo della struttura
       if(~isempty(tmp))
          cnt=cnt+1;
          struct_00_.(['field' num2str(cnt)])=tmp
       end
    end
    
Devi accedere o registrarti per scrivere nel forum
2 risposte