Info

此问题已关闭。 请重新打开它进行编辑或回答。

Vectorize loop with function containing randoms

1 次查看(过去 30 天)
Hello,
I would like to know if there is any way to vectorize this:
ds=zeros(1,max);
for i=1:max
ds(i)=containsRandoms(p1);
end
p1 is always a fixed scalar, I just want to execute the function many times to fill ds. The function I'm calling inside the loop contains randoms and many other calculations, so it will produce a different result each time.
I was trying something like
ds(1:max)=containsRandoms(p1);
but it is only executing containsRandoms once, and therefore ds is filled with the same value repeated max times.
Thanks in advance.

回答(3 个)

Peter
Peter 2011-10-14
You'd have to vectorize containsRandoms, not just the assignment to ds.
  4 个评论
Sean de Wolski
Sean de Wolski 2011-10-14
Yes. Avoid arrayfun. A for-loop is easier to understand and probably faster, especially in older versions.
sforza
sforza 2011-10-14
I'm using 2010b for no specific reason, I could also switch to 2011b, I'm on a campus license. Is there any noticeable improvement in the for loops speed between these versions?
Thanks for all your anwers!

Fangjun Jiang
Fangjun Jiang 2011-10-14
First, don't use max as a variable name as max() is a popular function.
Second, Are you looking at: ds=rand(5,3) for example?
Or:
a=magic(3);
b=arrayfun(@containsRandoms,a)
Assume your function containsRandoms() is something like this:
function out=containsRandoms(in)
out=in+rand;
  5 个评论
Fangjun Jiang
Fangjun Jiang 2011-10-14
Then, arrayfun() is probably what you are looking for. See update in the answer.
sforza
sforza 2011-10-14
You are right, arrayfun is what I was looking for. Thank you.

Andrei Bobrov
Andrei Bobrov 2011-10-14
ds = arrayfun(@(i1)containsRandoms(p1),1:max1);
%if size of 'ds' m x n eg. 2 x 2
ds = reshape(arrayfun(@(i1)containsRandoms(p1),1:2*2),2,[]);
  2 个评论
sforza
sforza 2011-10-14
You are also right, thanks andrei for the detailed sintax, I'm using this one.
After checking the documentation, I'm not sure what does @(i1) do. Could you please explain it a little bit more in depth?
However, I've done a couple of quick tests and there is no noticeable speed improvement, this new version is even sligthly slower than the loop version from my first post. I've tried with 10000 iterations. Is this normal? I was expecting the opposite behaviour, it to be faster.
At least looks cleaner, that's for sure :)
Fangjun Jiang
Fangjun Jiang 2011-10-14
Search for "anonymous function" in documentation to understand @().

此问题已关闭。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by