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.