[MatLab] Valori delle componenti positive?

MaxScalin
Buongiorno a tutti,
devo creare una funzione che ricevendo in input 3 vettori a 4 componenti (come X1=1, 2, 3, 4) sia in grado di fornire in output un vettore T le cui componenti siano i valori medi delle sole componenti positive.

L'ho fatta creando un indice che tramite un for cambia valore in base alla posizione nel vettore. All'interno ho scritto un if che controlla se il valore in quella posizione è maggiore di zero.

C'è un modo per far svolgere il controllo if su tutte le variabili che iniziano con la stessa porzione di nome come input* e contatore* ?
Ho chiamato le variabili input1, input2, input3, input4, contatore1, contatore2, contatore3, contatore4.

Risposte
gugo82
Beh, ragionaci un po’.
Quasi sicuramente (ma non troppo, visto che non tocco MatLab da un decennio circa), è già implementata una funzione che ti restituisce la parte positiva di un vettore. Vedi se c’è ed usala.
Se non c’è, creala: non ci vuole niente.

apatriarca
In matlab (e in praticamente qualsiasi altro linguaggio) il modo migliore di fare la stessa operazione su più oggetti è quella di inserire tale oggetti in un vettore (o lista o altro). Puoi quindi per esempio scrivere:
inputs = [input1; input2; input3; input4];

A questo punto la prima componente di ogni vettore sarà [inline]inputs(:, 1)[/inline] e il primo vettore sarà [inline]inputs(1, : )[/inline].

A questo punto in Matlab esistono soluzioni migliori all'uso di un ciclo. Per prima cosa è possibile accedere a tutti gli elementi di una matrice che rispettano una condizione scrivendo per esempio [inline]inputs(inputs > 0)[/inline] per ottenere tutti gli elementi positivi del tuo vettore. Dopodiché funzioni come [inline]mean[/inline] che restituiscono la media di un vettore, funzionano anche su matrici e array multidimensionali. Il seguente codice dovrebbe quindi restituire il vettore T:
inputs = [input1; input2; input3; input4];
T = sum(inputs .* (inputs>0))./sum(inputs>0);


EDITS: [inline]inputs(inputs > 0)[/inline] restituisce un vettore monodimensionale con gli elementi e non una matrice. In effetti la versione corretta consiste nel moltiplicare [inline]inputs[/inline] e [inline]inputs>0[/inline] in questo caso. Questo secondo vettore contiene infatti 1 nelle posizioni in cui la condizione è verificata e 0 altrimenti per cui moltiplicando insieme (component-wise..) le due matrici ottieni una matrice con zero nelle posizioni in cui l'elemento era negativo e il valore altrimenti. In modo simile non puoi usare mean perché considererebbe gli zero nella media, per cui è necessario implementarlo direttamente con [inline]sum[/inline]

MaxScalin
Grazie mille per la risposta :). Sono agli inizi con matlab :)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.