1

假设 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 中是否可行?

4

1 回答 1

2

我认为您会发现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(问题的维度),SA_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 ) ) );
于 2013-09-30T05:53:53.020 回答