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 を通過しますが、一度に 1 列の P1 だけを通過させたいですか?

4

1 に答える 1

0

したがって、modelベータが 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実際に実行できるコード (つまり、 andの定義のような外部のものに依存しないコード) を提供しない限り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% 確信が持てませんが、問題ないと思います。

于 2012-09-26T18:21:17.947 に答える