A quanto ho capito (correggimi se sbaglio):
[*] il vettore "b" contiene numeri "double" (non interi)
[*] non sei interessato ad ottenere, alla fine un particolare valore di "f"
[*] quello che conta è trovare il valore all'interno del vettore "b" che più si avvicina ad "a" (al limite il valore uguale ad "a", cosa peraltro abbastanza improbabile se "b" contiene valori "double")
Se è così, si può risolvere il problema senza loop e con una sola linea di codice:
[differenza_minima,idx]=min(abs(b-a))
Nello specifico:
abs(b-a)
ritorna un vettore nel quale ogni elemento è il valore assoluto della differenza tra il corrispondente valore di "b" ed "a"
[differenza_minima,idx]=min(abs(b-a))
la funzione "min" ritorna in "differenza_minima" il valore minimo del vettore in input (quello delle differenze) ed in "idx" la posizione dell'elemento minimo nel vettore in input.
Di conseguenza:
b(idx)
è il valore, all'interno del vettore "b" che più si avvicina al valore di "a".
La variabile "differenza_minima" può essere assimilata al valore di "f" che avresti trovato implementando l'approccio mediante il loop.