How to vectorize this type of function?
1 次查看(过去 30 天)
显示 更早的评论
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?
采纳的回答
Matt J
2013-5-2
nn=0:max(a);
T=[1,cumprod(1:nn(end))];
T=cumsum((-1).^nn./T);
f=T(a+1).*(-1).^mod(a,2),
3 个评论
Matt J
2013-5-3
编辑:Matt J
2013-5-3
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.
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrix Indexing 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!