2012-09-26 70 views
0

我可以引導這個for循環嗎?帶Matrix參數的Vectorise函數調用

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'命令;這是從一個Matlab工具箱? – macduff

+0

我們需要知道模型函數的功能。你能提供它的定義嗎? 。 –

回答

0

所以看起來model預計公測是一個1×N個陣列,並返回一個1xM陣列。因此,您首先需要修改model以獲取beta的de.nP x N數組,並返回de.nP x M數組(並且您將要向模型中的矢量化計算)。

我不知道該怎麼辦y M的。如果它只是一個數字,你不需要改變任何東西。如果是1xM陣列本身,那麼你需要做的

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

然後要更換

ObjVal=dot(aux,aux); 

ObjVal=dot(aux,aux,2); 

我會補充說,除非你提供的告誡我們的代碼實際上可以運行(即不依賴外部的東西,如demodel的定義),很難給出明確的答案。

編輯哦,我想你需要一個像

F=OF(P1',data); 

東西來取代你的for循環編輯

我認爲有以下正確的矢量化功能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%肯定這會起作用,但我認爲沒關係。

+0

函數y = NSS(測試版,墊) GAM1 =墊/β(5); gam2 = mats。/ beta(6); aux1 = 1-exp(-gam1); aux2 = 1-exp(-gam2); Y =β(1)+β(2)*(aux1./gam1)+beta(3)*(aux1./gam1+aux1-1)+beta(4)*(aux2./gam2+aux2-1 ); 結束 – Bazman

+0

以上是原型中的「模型」,模型實際上是函數句柄「@NSS」。該句柄存儲在結構對象數據中。 data.yM是1 * 15數組,beta是1 * 6數組 – Bazman

+0

模型(@NSS)返回1 * 15數組 – Bazman