Controllo tipo di variabile

di il
1 risposte

Controllo tipo di variabile

Buongiorno a tutti.
In pratica dovrei verificare in un ciclo 'if' se una variabile è un numero o meno e fare eseguire di conseguenza una certa operzaione, solo che non so come scrivere la condizione nell'if.
Spero di essere stata chiara nela spiegazione del problema.
In poche parole vorrei ottenere uno script che faccia i seguenti due passaggi:
'se la variabile a non è un numero'
'fai questo'

Grazie a tutti

1 Risposte

  • Re: Controllo tipo di variabile

    Ci sono diverse funzioni che possono essere usate per risolvere il problema, ad esempio:

    ischar: ritorna 1 (valore logico - true) se l'argomento è una stringa di caratteri (o anche un solo carattere), 0 (valore logico - false) in caso contrario (cioè se non è una stringa, ma in questo caso non "dice" quale sia il "tipo" della variabile in input; potrebbe essere un numero, una matrice di numeri, una struttura, un cellarray)

    isnumeric: ritorna 1 (valore logico - true) se l'argomento è un vettore, una matrice od un singolo numero , 0 (valore logico - false) in caso contrario (cioè se non è un numero, ma in questo caso non "dice" quale sia il "tipo" della variabile in input; potrebbe essere una stringa, una struttura, un cellarray, un valore logico)

    iscell: ritorna 1 (valore logico - true) se l'argomento è un cellarray, 0 (valore logico - false) in caso contrario (cioè se non è un cellarray, ma in questo caso non "dice" quale sia il "tipo" della variabile in input; potrebbe essere un numero, una matrice di numeri, una struttura, uno scalare, un vettore, una matrice)

    isstruct: ritorna 1 (valore logico - true) se l'argomento è una struttura, 0 (valore logico - false) in caso contrario (cioè se non è una struttura, ma in questo caso non "dice" quale sia il "tipo" della variabile in input; potrebbe essere un numero, una matrice di numeri, un cellarray, uno scalare, un vettore, una matrice)

    La scelta della funzione dipende ... da quello che si vuole fare ...

    Qualche esempio:
    
    for i=1:5
       switch(i)
          case 1
             a=33;
          case 2
             clear a % per rimuovere un warning
             a.nome='Aginulfo';
             a.eta=99;
          case 3
             a='questa è una stringa';
          case 4
             a=magic(4)
          case 5
             a={[1:4],'anche questa è una stringa'};
       end
       if(ischar(a))
          a
          disp('stringa')
       elseif(isnumeric(a))
          a
          disp('numero')
       elseif(iscell(a))
          a
          disp('cellarray')
       elseif(isstruct(a))
          a
          disp('struct')
       end
       
    end
    
    Volendo approfondire un po' l'analisi della variabile, si può creare una funzione che analizzi la variabile in input e ne determini il tipo.
    
    function tipo=string_or_not(a)
    % tipo=string_or_not(a)
    %   analizza il "tipo" della variabile in input
    %      valore ritornato:
    %         0: la variabile è una matrice vuota ([])
    %         1: la variabile è una stringa
    %         2: la variabile è una matrice di stringhe
    %         3: la variabile è uno scalare
    %         4: la variabile è una matrice
    %         5: la variabile è un cellarray
    %         6: la variabile è una struttura
    
    if(iscell(a))
       tipo=5;
       [r,c]=size(a);
       for i=1:r
          for j=1:c
             tmp=a{i,j}
             if(ischar(tmp'))
                disp(['element(' num2str(i) ',' num2str(j) ') is a string'])
             elseif(isstruct(tmp))
                disp(['element(' num2str(i) ',' num2str(j) ') is a sruct'])
                [rs,cs]=size(tmp);
                sf=fieldnames(tmp);
                for k=1:length(sf)
                   if(ischar(tmp(1).(sf{k})))
                      disp(['Field "' sf{k} '" is a string'])
                   elseif(iscell(tmp(1).(sf{k})))
                      disp(['Field "' sf{k} '" is a cellarray'])
                   else
                      [tmp_r,tmp_c]=size(tmp(1).(sf{k}));
                      if((tmp_r+tmp_c) == 2)
                         disp(['Field "' sf{k} '" is a scalar'])
                      else
                         disp(['Field "' sf{k} '" is a (' num2str(tmp_r) ' x ' num2str(tmp_c) ') matrix'])
                      end
                   end
                end
             else
                [tmp_r,tmp_c]=size(tmp);
                if((tmp_r+tmp_c) == 0)
                   disp(['element(' num2str(i) ',' num2str(j) ') is a empty matrix'])
                elseif((tmp_r+tmp_c) == 2)
                   disp(['element(' num2str(i) ',' num2str(j) ') is a scalar'])
                else
                   disp(['element(' num2str(i) ',' num2str(j) ') is a (' num2str(tmp_r) ' x ' num2str(tmp_c) ') matrix'])
                end
             end
          end
       end
    elseif(isstruct(a))
       tipo=6;
       disp(['the variable is a sruct'])
       [rs,cs]=size(a);
       sf=fieldnames(a);
       for k=1:length(sf)
          if(ischar(a(1).(sf{k})))
             disp(['Field "' sf{k} '" is a string'])
          elseif(iscell(a(1).(sf{k})))
             disp(['Field "' sf{k} '" is a cellarray'])
          else
             [tmp_r,tmp_c]=size(a(1).(sf{k}));
             if((tmp_r+tmp_c) == 2)
                disp(['Field "' sf{k} '" is a scalar'])
             else
                disp(['Field "' sf{k} '" is a (' num2str(tmp_r) ' x ' num2str(tmp_c) ') matrix'])
             end
          end
       end
    elseif(ischar(a))
       [tmp_r,tmp_c]=size(a);
       if((tmp_r+tmp_c) == 1)
       tipo=1;
          disp(['The varaible is a single char'])
       else
       tipo=2;
          disp(['The variable is a (' num2str(tmp_r) ' x ' num2str(tmp_c) ') matrix of strings'])
       end
    else
       [tmp_r,tmp_c]=size(a);
       if((tmp_r+tmp_c) == 0)
          tipo=0;
          disp(['The variable is a empty matrix'])
       elseif((tmp_r+tmp_c) == 2)
          tipo=3;
          disp(['The variable is a scalar'])
       else
          tipo=4;
          disp(['The variable is a (' num2str(tmp_r) ' x ' num2str(tmp_c) ') matrix'])
       end
       
    end
    
    ... vuoi provare a "scoprire" cosa fa questa funzione ... senza commenti?

    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
1 risposte