2013-08-06 32 views
1

我想估計三個參數,同時用MATLAB中的函數fmincon最小二乘方誤差最小。我的目標函數看起來像:MATLAB:fmincon與三維數據

f = @(a,b,c) sum(sum(sum((M - a - b - c).^2))); 

M哪裏是一個三維陣列,其尺寸20x7x16和所估計的參數a, b, c分別是與尺寸20X1,7X1和16X1載體。爲了估計它,我通過將向量a重複到數組20x7x16中來「製作」它們3D,並且我也爲bc做了同樣的處理。我需要矢量ab中元素的總和爲1作爲線性約束。我的問題有兩個:

  1. 當Aeq是一個二維矩陣並且beq是一個向量時,我應該如何指定線性約束?
  2. 如何設置a,b,c的出發點,以便MATLAB知道它們的估計值是在此3D數組中重複的向量?

我想展開3D陣列M成2D矩陣和調整參數a,b,c但起始點的問題仍然存在,因爲我必須將它們定義爲一個矢量,而不是作爲一個矩陣。

我非常感謝您的意見和建議。也許我想複雜,還有另一種方式如何去做。

預先感謝您。

回答

0

請勿複製abc!使用bsxfun代替

f = @(a,b,c) sum(reshape(bsxfun(@minus, bsxfun(@minus, bsxfun(@minus, M, a), b'), permute(c, [2 3 1])), [], 1)) 

現在你的參數vecotrs而不是載體的重複。我相信這也能解決你所有的其他問題。

+0

非常感謝您的回答!這個功能真的是我需要的。我只是不明白你爲什麼排列數組M(我猜,因爲c是一個16x1向量)。 – user2655769

+0

@ user2655769我不排列'M',因爲我需要它的非singelton維度與'M'的第三維共同引入,所以我只排列'c'。在命令行中嘗試使用此命令以查看其效果。 – Shai

+0

好吧,我現在明白了。爲了減去最後一個參數'c',我們必須重新排列3D陣列'M'的剩餘部分。並且爲了在你將它重新整合成一個大的矢量之後使用'sum'。我把它改成了f = @(a,b,c)sum(reshape(bsxfun(@minus,permute(bsxfun(@minus,bsxfun(@minus,M,a),b'),[2 3 1] ),c),[],1)。^ 2)' – user2655769