【问题标题】:MATLAB: fmincon with three-dimensional dataMATLAB:具有三维数据的 fmincon
【发布时间】:2013-08-06 08:34:35
【问题描述】:

我想估计三个参数,同时使用 MATLAB 中的函数 fmincon 最小二乘二次误差。我的目标函数如下所示:

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

其中M 是尺寸为 20x7x16 的 3D 数组,估计参数 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 但起点问题仍然存在,因为我必须将它们定义为向量而不是矩阵。

非常感谢您的想法和建议。可能我正在考虑复杂,还有另一种方法可以做到这一点。

提前谢谢你。

【问题讨论】:

    标签: matlab minimize


    【解决方案1】:

    请勿复制 a bc!改用bsxfun

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

    现在您的参数是向量,而不是向量的复制。我相信这也将解决您的所有其他问题。

    【讨论】:

    • 非常感谢您的回答!这个功能真的是我需要的。我只是不明白你为什么要置换数组 M(我猜,因为 c 是一个 16x1 向量)。
    • @user2655769 我不置换M,我只置换c,因为我需要它的非单一维度与M 的第三维度共存。在命令行中试试这个命令看看效果。
    • @user2655769 顺便说一句,如果此解决方案适合您,请考虑单击旁边的“V”图标“接受”它。谢谢。
    • 好的,我现在明白了。为了减去最后一个参数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 在评论中看到permute 对我来说有点困难——所以我无法判断它是否正确。最好的方法是在命令行中进行尝试,并将其与您之前使用向量复制的版本进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多