使用Matrix参数调用Vectorise函数

时间:2012-09-26 15:20:11

标签: matlab

我可以将此矢量化为循环吗?

F=zeros(de.nP,1);

for i=1:de.nP 
   F(i)=OF(P1(:,i)',data);
end

function ObjVal=OF(beta, data)
  mats=data.mats;
  yM=data.yM;
  model=data.model;
  y=model(beta,mats);
  aux=y-yM;
  ObjVal=dot(aux,aux);
end

当我尝试这样做时:

 F=OF(P1,data);

它同时通过所有P1,但我希望它一次只能传递一列P1?

1 个答案:

答案 0 :(得分:0)

所以看起来model期望beta为1xN数组,并返回1xM数组。因此,您首先需要修改model以获取测试版的de.nP x N数组,并返回de.nP x M数组(并且您希望在模型中对计算进行矢量化)。

我不知道如何处理yM。如果它只是一个数字,则无需更改任何内容。如果它本身是1xM阵列,那么你需要做

aux=y-repmat(yM, [size(y,1) 1]);

然后你要替换

ObjVal=dot(aux,aux);

ObjVal=dot(aux,aux,2);

除非您向我们提供实际可以运行的代码(即不依赖于demodel的定义等外部内容),否则我将添加警告,这很难给出一个明确的答案。

编辑哦,我想你需要用

之类的东西替换你的for循环
F=OF(P1',data);

修改

我认为以下内容正确地对您的model函数进行了矢量化:

function y = NSS(beta, mats)
    gam1 = (1./beta(:,5)) * mats;
    gam2 = (1./beta(:,6)) * mats;
    aux1=1-exp(-gam1);
    aux2=1-exp(-gam2);
    y = repmat(beta(:,1), [1 length(mats)]) + ...
        repmat(beta(:,2), [1 length(mats)]) .* (aux1./gam1) + ...
        repmat(beta(:,3), [1 length(mats)]) .* (aux1./gam1 + aux1 - 1) + ...
        repmat(beta(:,4), [1 length(mats)]) .* (aux2./gam2 + aux2 - 1);
end

同样,由于我无法运行您的代码,我不能100%确定这会有效,但我认为没问题。