La estructura de la matriz oculta el hecho de que este es un proceso relativamente simple problema de optimización convexa. Deje $\mathop{\textbf{vec}}$ ser el operador que las "pilas" las columnas de una matriz en un vector de altura. Entonces, este problema es
\begin{array}{ll}
\text{minimize}_{a,\lambda} & \| a - a_0 \|_2 \\
\text{subject to} & (x^T \otimes I) a - \lambda x = 0 \\
& a \geq 0
\end{array}
donde$a \triangleq \mathop{\textbf{vec}}(A)$$a_0 \triangleq \mathop{\textbf{vec}}(A_0)$, e $\otimes$ es el producto de Kronecker.
Esto es fácil de fundición como de segundo orden cono o una cuadrática programa. La función objetivo es convexa en a $A$, y las restricciones son lineales en $(A,\lambda)$.
Si utiliza un marco de modelado como CVX (descargo de responsabilidad: la mía) o YALMIP (no la mía!) entonces usted no necesita meterse con el $\mathop{\textbf{vec}}$ operador o productos de Kronecker, porque eso es lo que hará para usted. En CVX, el modelo es
cvx_begin
variables A(m,n) lambda
minimize(norm(A-A0,'fro'))
subject to
A >= 0
A * x == lambda * x
cvx_end
EDIT: Otra cosa buena acerca del uso de un marco como este es que si usted decide que usted estaría interesado en minimizar el espectro de la norma (es decir, el máximo valor singular) de $A-A_0$ en lugar de eso, cambiar el objetivo a norm(A-A0)
. Usted puede incluso minimizar la nuclear de la norma (es decir, la suma de los valores singulares) con norm_nuc(A-A0)
!
Para dos de estas alternativas, el problema debe ser reestructurada como una semidefinite programa, y no de una manera directa; y será más lento. Pero usted puede permanecer felizmente inconscientes de cómo la proverbial salchicha, y dejar que el marco de hacerlo por usted. YALMIP puede hacer todas estas cosas así.