2017-10-08 3 views
0

J'ai besoin d'aide pour parcourir une fonction qui dépend de deux variables. Donc, disons que j'ai une fonction qui dépend de deux variables. Appelons-le f = x + yMatlab Comment faire une itération d'une fonction à travers une liste

Maintenant, j'ai deux listes, une des variables x et une des variables y. Par exemple, xlist = [1 2 3] et ylist = [4 5 6]

Et je veux parcourir chaque élément des listes et le brancher sur f. Par exemple, définissez x = 1, puis évaluez f pour y = 4, puis y = 5, puis y = 6 ... et répétez pour x = 2 et x = 3.

Enfin, je veux retourner une matrice des valeurs calculées. Pour l'exemple ci-dessus, la réponse devrait être [5 6 7]; [6 7 8]; [7 8 9]

Comment ferais-je cela?

Répondre

2

En supposant que la fonction ne peut pas être vectorisé et donc vous avez vraiment besoin d'itérer, un moyen simple est par ndgrid (pour créer x, valeurs y qui décrivent toutes les paires possibles) et arrayfun (pour itérer au cours des deux x, y valeurs en même temps):

f = @(x,y) x+y; % Or f = @fun, if fun is a function defined elsewhere 
xlist = [1 2 3]; 
ylist = [4 5 6]; 
[xx, yy] = ndgrid(xlist, ylist); % all pairs 
result = arrayfun(f, xx, yy); 

Dans Dans de nombreux cas, la fonction peut être vectorized, ce qui se traduit par un code plus rapide. Pour l'exemple fonction ce serait fait définir f comme

f = @(x,y) bsxfun(@plus, x(:), y(:).'); 

ou ces dernières versions de Matlab, vous pouvez exploiter implicit singleton expansion et il suffit d'écrire

f = @(x,y) x(:)+y(:).'; 

Dans les deux cas, notez que les deux arguments d'addition sont forcés comme un vecteur de colonne (x(:)) et un vecteur de rangée (y(:).'), de sorte que l'expansion du singleton crée automatiquement toutes les paires:

xlist = [1 2 3]; 
ylist = [4 5 6]; 
result = f(xlist, ylist); 
+0

merci beaucoup! Juste curieux, pourriez-vous me donner un exemple de la façon de résoudre un problème si la fonction peut être vectorisée? – Programmer

+0

@Marcus C'est la deuxième partie de la réponse, n'est-ce pas? Ou que veux-tu dire? –

1

Une autre façon de le faire serait d'utiliser deux pour les boucles:

x_values=[2,4,6,8]; 
y_values=[1,3,5,7]; 
%initialize a matrix with zeros 
output_matrix=zeros(length(x_values),length(y_values)); 
for i=1:length(x_values) 
    for j=1:length(y_values) 
     output_matrix(i,j)=x_values(i)+y_values(j); 
    end 
end 

output_matrix