使用matlab

时间:2015-11-16 15:30:13

标签: matlab vector vectorization

刚开始使用matlab并且遇到了一些麻烦,找到了以下操作的解决方案:

我正在尝试初始化1000个不同值的向量,其函数不接受任何参数作为输入。我可以用for循环来做这个,但是没有找到如何做到这一点。

我的预期会起作用:

z = zeros(1,1000)
result = arrayfun(*functionname*,z)

然而,这会产生错误,指出第一个输入必须是函数句柄。

我的函数是monte carlo方法的简单实现,用于计算pi:

   function Result = mcm()                                                                                                                                                                        
   clear                                                                           
   N=1000;                                                                         
   M=0;                                                                            
   for j=1:N                                                                       
           p=[2*rand-1; 2*rand-1];                                                 
           if p'*p<1                                                               
           M=M+1;                                                                  
          end                                                                     
   end                                                                             
   Result=4*M/N  

2 个答案:

答案 0 :(得分:3)

实际对您的给定函数mcm进行矢量化的一种方法是 -

N = 1000; %// Number of data points 
P = [2*rand(1,N)-1; 2*rand(1,N)-1]; %// OR 2*rand(2,N)-1
out = 4*sum(sum(P.^2,1)<1)/N

运行时测试

代码 -

N = 1000000; %// Number of data points 

disp('---------------- With Original Approach')
tic
M=0;
for j=1:N
    P=[2*rand-1; 2*rand-1];
    if P'*P<1
        M=M+1;
    end
end
Result=4*M/N;
toc

disp('---------------- With Proposed Approach')
tic
P = 2*rand(2,N)-1;
out = 4*sum(sum(P.^2,1)<1)/N;
toc
时间&amp;输出 -

---------------- With Original Approach
Elapsed time is 3.952998 seconds.
---------------- With Proposed Approach
Elapsed time is 0.089590 seconds.
>> Result
Result =
       3.1422
>> out
out =
       3.1428

答案 1 :(得分:1)

由于您的函数不带参数,因此您无法使用arrayfunarrayfun将函数应用于数组中的每个元素。

而是使用它:

z = ones(1,1000) * mcm;

另一个好处是mcm只运行一次,因此比循环该函数1000次更快。