使用Matlab最小化二次形式能量。我应该使用哪个函数?

3
我是新手,想用matlab进行一些能量最小化的工作。能量函数以3通道图像为输入。对于每个通道,有一个能量项如下:
E = x'Ax + ||Bx||^2 + w*||x-c||^2,
其中x、c是长度为N的向量,A是大小为N*N的矩阵。A是稀疏的、半正定的,并且每行有25个非零元素,给出了对x的所有元素的约束条件。B的大小为M*N。B也是稀疏的,并且每行有2个非零元素。N大约为850,000,M大约为1,000,000。虽然B给出的约束条件多于N,但是x的某些元素与||Bx||^2项无关。项||x-c||^的权重w相当小,比如1e-3。
我已经在matlab文档中搜索过了。看起来我应该使用lsqnonlin解决这个问题。在matlab中是否有专门设计的函数或选项来进行二次形式的最小化?
对于那些熟悉计算机视觉文献的人,我实际上正在尝试实现“从照片集合中获得连贯内在图像”的算法。作者说他们使用matlab反斜杠运算符来最小化能量,但我不知道反斜杠运算符如何用于二次形式问题。

1
你能将 A 分解为 A = C'*C 吗? - Shai
2
@Shai 我也这么认为。你是说我应该将 (A+B'B) 分解为 (A+B'B = C'C),然后解 Cx=0 吗?谢谢你!这是基本的数学,但真的很有用。顺便问一下,matalb 会保证最小范数解吗? - Bei
1
对于一个过完备的系统,Matlab中Cx=0的反斜杠解是最小二乘法,即最小化||Cx||^2|| - Shai
1个回答

1

是的,有一个专门用于优化二次代价函数的函数:quadprog。但是,如果您没有任何线性约束条件,那么您应该能够将成本函数编写为

E = x'Mx/2 + vx + k

找到零梯度点(希望是最小值)可以通过取一阶导数来实现:
dE/dx = Mx + v

将它们设置为零,得到解决方案:
x = -M\v

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接