我正在尝试创建一个符号矩阵,但我想将其中一些元素修复为0,以减少问题的大小。我还希望将所有值发送为正值。我试过这个:
X = sym ('x',[n,n]);
X = sym(X,'positive');
X=times(X,Xf);
其中Xf是一个带零的nxn矩阵,其中我想要固定值,而我希望在矩阵中有变量。
当我使用fminunc
解决问题时,我得到一些负值,而且我想要修复的值也有非零值。
n在我的情况下是30并且用fmincon
解决它是不可能的
答案 0 :(得分:0)
在阅读了我的问题的答案后,我认为你不需要使用符号变量。假设您想最小化平方差异,您可以尝试以下方法:
n = 30;
sumc = (10:n+9)'; % example target sum along columns
sumr = 15:n+14; % example target sum along rows
Xtarget = magic(n); % example target matrix
Xf = fliplr(eye(n)); % example masking matrix
X = zeros(n); % example matrix with constant values for masked inputs
if 0 % easy test case
X = Xtarget;
sumc = sum(X, 2);
sumr = sum(X, 1);
end
ix = find(Xf);
cost = @(A) norm(A(:) - Xtarget(:)) + ...
norm(sum(A,1) - sumr) + ...
norm(sum(A,2) - sumc);
x = fminunc(@(x) cost(subsasgn(X, substruct('()', {ix}), exp(x))), rand(length(ix), 1)); %#ok<SUBSASGN>
X(ix) = exp(x);