0

我可以矢量化这个 for 循环吗?

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?

4

1 回答 1

0

所以它看起来像model期望 beta 是一个 1xN 数组,并返回一个 1xM 数组。因此,您首先需要修改model以将 de.nP x N 数组用于 beta,并返回一个 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% 确定这会起作用,但我认为没关系。

于 2012-09-26T18:21:17.947 回答