假设 A 是一个 nxn 矩阵,并且我观察到 A 的一些条目,例如,对于 {1,...,n} x {1,...,n} 中的某个子集 S 的 A_S。我想知道A是否有可能排名1。
所以这可以重新表述为以下问题:是否存在向量 x 和 y 使得 xy^T 限制在 S 上等于观察值 A_S?
通过连接 x 和 y,比如说,让 z = [x;y],我们可以将此约束写为 z 中的二次形式。如何测试约束在 Matlab 中是否可行?
我认为您会发现fmincon
对您的情况有所帮助。
将目标函数保留为零,并将非线性等式约束编码为二次约束。
编写一个 m 函数:
function err = myQuadEqCon( z, n, S, A_s )
% given z ( a concatanation of x and y n-vectors ) and a set of entries S
% checks (x*y')(S) == A_s
x = z( 1:n );
y = z( (n+1):end );
xy = x*y.';
err = sum( abs( xy(S) - A_s ) );
现在,在你的“主要”函数/脚本中,确保你有n
(问题的维度),S
并A_s
正确定义,然后
>> z = fmincon( @(z) 0, ... % objective function plays no role
z0, ... % your initial guess for x and y
[], [], [], [], [], [], ... % linear constraints are empty
@( z ) deal( 0, ... % first output nonlinear inequalities
myQuadEqCon( z, n, S, A_s ) ) );