刚开始使用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
答案 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)
由于您的函数不带参数,因此您无法使用arrayfun
。 arrayfun
将函数应用于数组中的每个元素。
而是使用它:
z = ones(1,1000) * mcm;
另一个好处是mcm
只运行一次,因此比循环该函数1000次更快。