是否可以在matlab中对函数脚本进行矢量化?

时间:2018-05-10 03:15:51

标签: matlab

如果我有明确的功能,我可以将其矢量化。如果我有一个函数脚本怎么样?例如,如果我有一个Fun.m脚本,Fun(x,y,z)给出一个值,我想计算x = [1,2,3]和y = [4,5](即(1) ,4),(1,5),(2,4),(2,5),(3,4),(3,5))当z = 10时,是否有任何可能的方法来做它除了使用for循环?实际上,我可能需要为长向量计算x,y。我想使用bsxfun(@(x,y)Fun(x,y,10),[1,2,3],[4,5]')但它不起作用。它表示矩阵维度不匹配。

让我发布Fun.m函数:

function density=HittingDensityOUlevel0(beta,r0,sigma,lambda,t0,i,p,MinOrMax)
g=zeros(1,i);
g(:,1)=-1.*MinOrMax.*2.*Integrand(r0,sigma,lambda,t0+p,t0,beta,r0);

for k=2:size(g,2)

    Sum=0;
    weight=zeros(1,k-1);
    for m=1:k-1
        R1=mod(k,2); Q1=floor(k./2);
        R2=mod(m,2); Q2=floor(m./2);

        if R1==0 && R2==1 && Q2<=Q1-1
            weight(:,m)=4./3;
        elseif R1==0 && R2==0 && Q2<=Q1-2
            weight(:,m)=2./3;
        elseif R1==1 && R2==1 && Q2<=Q1-2
            weight(:,m)=4./3;
        elseif R1==1 && R2==0 && Q2<=Q1-3 && Q1>=3
            weight(:,m)=2./3;
        elseif R1==1 && R2==0 && m==2*(Q1-1)
            weight(:,m)=17./24;
        elseif R1==1 && m==2*Q1-1 && Q1>=1
            weight(:,m)=9./8;
        elseif R1==1 && m==2*Q1 && Q1>=1
            weight(:,m)=9./8;
        end

    end

    TimeTicker=(t0+p):p:(t0+(k-1)*p);
    Sum=Sum+2.*p.*sum(weight.*g(:,1:(k-1)).*arrayfun(@(t)Integrand(r0,sigma,lambda,t0+k.*p,t,beta,beta),TimeTicker));
    g(:,k)=-1.*MinOrMax.*2.*...
    Integrand(r0,sigma,lambda,t0+k.*p,t0,beta,r0)+MinOrMax.*Sum;

end

density=g(:,end);

function ret=Integrand(r0,sigma,lambda,t,tau,x,y)
    ret=(lambda.*r0.*exp(-lambda.*t)./2+...
(x-r0.*exp(-lambda.*t))./2.*lambda.*cosh(lambda.*(tau-t))./sinh(lambda.*(tau-t))-...
(y-r0.*exp(-lambda.*tau))./2.*lambda./sinh(lambda.*(tau-t))).*...
...
(1./sqrt(pi.*sigma.^2./lambda.*(1-exp(-2.*lambda.*(t-tau))))).*...
...
(exp(-((x-r0.*exp(-lambda.*t)-exp(-lambda.*(t-tau)).*(y-r0.*exp(-lambda.*tau))).^2)./...
(sigma.^2./lambda.*(1-exp(-2.*lambda.*(t-tau))))));

我想用(例如)t0 = [1,2,3]和r0 = [4,5]对这个Fun进行矢量化。但它不起作用。

1 个答案:

答案 0 :(得分:0)

使用meshgrid为您的函数生成所有可能的输入对。

[tt0,rr0] = meshgrid([1,2,3],[4,5])

以便tt0 = [1,2,3,1,2,3]rr0 = [4,4,4,5,5,5]

然后将其传递给bsxfun。