【问题标题】:Initialize vector with function in matlab在matlab中用函数初始化向量
【发布时间】:2015-11-16 15:30:12
【问题描述】:

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

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

我期望它会起作用:

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

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

我的函数是计算 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  

【问题讨论】:

  • 你想在所有地方都使用相同的值吗?如果是这样,请使用z = ones(1,1000) * mcm;
  • 在这种情况下,我认为循环是最合适的方式。

标签: matlab vector vectorization


【解决方案1】:

实际上矢量化给定函数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

时间和输出 -

---------------- 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

【讨论】:

    【解决方案2】:

    由于你的函数没有参数,你不能使用arrayfunarrayfun 将函数应用于数组中的每个元素。

    改用这个:

    z = ones(1,1000) * mcm;
    

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

    【讨论】:

    • 我想 OP 每次都想要不同的数字来做一些统计分析,比如找到标准错误等......
    • 在这种情况下不方便,因为我想获得 1000 次不同的函数计算。
    • @AlfonsIngomar 那么你需要改变你的问题。这个答案完全符合您的问题。它用函数值初始化一个向量。为了让它做你想做的事,在mcm 中输入一个虚拟输入并且不要使用它。然后你可以使用arrayfun。或者干脆使用 for 循环。
    猜你喜欢
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 2021-12-31
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多