我可以将此矢量化为循环吗?
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?
答案 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);
除非您向我们提供实际可以运行的代码(即不依赖于de
和model
的定义等外部内容),否则我将添加警告,这很难给出一个明确的答案。
编辑哦,我想你需要用
之类的东西替换你的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%确定这会有效,但我认为没问题。