2013-08-06 28 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