Aiuto esercizio Octave

di il
1 risposte

Aiuto esercizio Octave

Ciao a tutti
mi servirebbe una mano per la risoluzione di questo esercizio per esame, volevo vedere come devo procedere per risolverlo.
Io uso Octave non so se ci siano delle grandi differenze con Matlab.

Esercizio.
Si definisca in linguaggio Matlab o Octave una funzione che ricevendo in input 3 vettori a 4 componenti X1 = [x1,y1,z1,t1] X2 = [x2,y2,z2,t2] X3 = [x3,y3,z3,t3] sia in grado di:

a. fornire in output un vettore K le cui componenti siano determinante dalle componenti siano determinate dai valori massimi di ciascuna componenti dei vettori di input
K = [max(x1,....,t1),max(x2,...,t2),max(x3,...,t3)]

b.fornire in output un vettore T le cui componenti siano determinate dai valori medi delle componenti positive (x1>0,...,t1>0) dei vettori di input T = [mad(x1,...,t1), med(x2,..,t2), med(x3,..,t3)]

Il punto a l ho gia risolto ma voglio vedere se l ho fatto correttamente il punto b invece mi ha creato qualche difficoltà.
Confido in un vostro aiuto.
Grazie mille per l'attenzione
Roberto.

1 Risposte

  • Re: Aiuto esercizio Octave

    La soluzione proposta è scritta in MatLab, farne il porting in Octave, potrebbe richiedere qualche modifica.

    Dati, ad esempio, 3 vettori "X1", "X2" e "X3":
    [*] Per il calcolo dei valori massimi si può usare direttamente la funzione "max"
    K=[max(X1),max(X2),max(X3),max(X4)]
    [*] Per il calcolo del valore medi delle componenti positive di ogni vettore, si può usare direttamente la funzione "mean" avendo cura di fornirle in input solo i valori positivi.
    T=[mean(X1(X1>0)),mean(X2(X2>0)),mean(X3(X3>0)),mean(X4(X4>0))]
    (*) X1(X1>0) ritorna gli indici dei valori positivi all'interno del vettore.

    Di conseguenza, la funzione più semplice che si può realizzare è:
    function [K,T]=max_media(X1,X2,X3)
    K=[max(X1),max(X2),max(X3)]
    T=[mean(X1(X1>0)),mean(X2(X2>0)),mean(X3(X3>0))]
    end
    
    Questa funzione ha però molti limiti, ad esempio:
    [*] non viene effettuato alcun controllo sulla validità dei dati in input (numero, tipo, dimensione)
    [*] si può usare solo se l'input è costituito da 3 vettori


    Una forma più "generale" della stessa funzione, potrebbe essere la seguente, valida per un numero qualunque di vettori in input, anche di lunghezze diverse tra loro:
    function [K,T]=max_mean(varargin)
    % MAX_MEAN: calcolo valore massimo e media degli elementi positivi (>0) dei
    % vettori (1 x N) o (N x 1) in input
    % Input:
    %    un numero qualunque di vettori (1 x N) o (N x 1): non sono ammesse
    %    matrici (N x M)
    %    sono ammessi solo vettori con valori valori "integer" o "double"
    %    i vettori possono avere lunghezza diversa tra loro
    % Output:
    %    K: vettore contenente il valore massimo di ognuno dei vettori in input
    %    T: vettore contenente il valor medio delle componenti positive (>0)
    %    dei vettori in inpu. Se tutti gli elementi dell'i-esimo vettore in
    %    input sono negativi, T=NaN
    %
    % Inizializzazione matrice temporanea "tmp" che conterrà, per ogni riga, i
    % vettori in input
    sz_cell=cellfun(@size,varargin,'uni',false);
    max_sz=max(cellfun(@max,sz_cell));
    tmp=nan(nargin,max_sz);
    % Inizializzazione delle varaibili di output
    K=[];
    T=[];
    % Loop per la verifica della consistenzadei vettori in input
    for i=1:nargin
       % I vettori in input possono contenere solo valori "integer" o "double"
       if(isfloat(varargin{i}) || isinteger(varargin{i}))
          % Identificazione della dimensione dello i-esimo verrore in input
          sz=size(varargin{i});
          % Costruzione della matrice temporanea "tmp": ogni riga contiene
          % uno dei vettori in input
          % Sono ammessi solo vettori (1 x N) o (N x 1): non sono ammesse
          % matrici (N x M)
          % Allo scopo di calcolare la media dei valori positivi (>0) dei
          % vettori, i dati minori o uguali a 0 vengono cancellati (i
          % vattori completi sono comunque memorizzati nella matrice
          % temporanea "tmp"
          sz_ok=0;
          if(sz(1) == 1)
             tmp(i,1:sz(2))=[varargin{i}];
             sz_ok=1;
             varargin{i}(find(varargin{i} <0))=[];
          elseif(sz(2) == 1)
             tmp(i,1:sz(1))=[varargin{i}.'];
             sz_ok=1;
             varargin{i}(find(varargin{i} <0))=[];
          else
             % Messaggio di errore in caso di vettori in input con dimensione
             % diversa da (1 x N) o (N x 1)
             error(['Input #' num2str(i) ' size=(' num2str(sz) '): not an (1 x N) or (N x 1) array'])
          end
       else
          % Messaggi odi errore in caso i vettori in input non siano di tipo
          % "integer" o "double"
          error(['Input #' num2str(i) ': is a ' class(varargin{i}) ' not an array of float or integer'])
       end
    end
    % Identificazione del valore massimo di ognuno dei vettori in input
    K=max(tmp');
    % Calcolo ella media degli elementi positivi (>0) di ogni vettore in input
    T=cellfun(@mean,varargin);
    % Cancellazione della matrice temporanea "tmp"
    clear tmp
    
    Script per testare la funzione
    
    % Generazione di vettori di esempio
    X1=rand(4,1)-0.5;
    X2=rand(1,6)-0.5;
    X3=rand(1,4)-0.5;
    X4=rand(1,4)-0.5;
    
    [K,T]=max_mean(X1,X2,X3,X4)
    [K,T]=max_mean(X1,X2)
    
    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
1 risposte