假设A是n×n矩阵,并且我已经观察到A的一些条目,例如,A_S对于{1,...,n} x {1,...,n}中的某个子集S.我想知道A是否有可能排名第一。
因此,可以将其重新表述为以下问题:是否存在向量x和y,使得在S上限制的xy ^ T等于观察值A_S?
通过连接x和y,比如说,让z = [x; y],我们可以将这个约束写成z中的二次形式。如何在Matlab中测试约束是否可行?
答案 0 :(得分: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
(问题的维度),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 ) ) );