How to vectorize this type of function?
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I have a function of the form:
f(a) = sum((-1)^n/factorial(a-n))
where the summation limits are n = 0 to a. If a is a scalar then I can just substitute 0:a for n in the expression. But if a is a vector, then the limits on the sum are different for every element of a. One way to compute it would be:
for i = 1:numel(a)
n = 0:a(i);
f(i) = sum((-1).^n./factorial(a(i)-n));
end
However, I would like to avoid using a for loop. I am wondering if anyone has any ideas for how to vectorize this?
Matt J provided a great solution to a simpler problem HERE. Is there any way to do something similar?
3 commentaires
Réponse acceptée
Matt J
le 2 Mai 2013
nn=0:max(a);
T=[1,cumprod(1:nn(end))];
T=cumsum((-1).^nn./T);
f=T(a+1).*(-1).^mod(a,2),
3 commentaires
Matt J
le 3 Mai 2013
Modifié(e) : Matt J
le 3 Mai 2013
The general idea is to create a look-up table, T, of all the things you are trying to evaluate and then index into the table with look-up values like a, nzmin, nzmax. Look-up tables are things that can often be filled sequentially/incrementally, using efficient vectorized MATLAB commands like cumsum or cumprod. Indexing into these tables is, of course, also vectorizable.
The strategy might not be so optimal if your look-up values were not reasonably dense throughout the table or if the cost of creating the table was high. For that, you might make several sub-tables or fall back to a for-loop.
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Matrix Indexing dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!