假设W是一个已知的向量,在这里我想找到唯一的解决方案a,例如:
Sum(min(1,W(i)/a))=M (M is known)
这种功能有没有具体名称?如果你们能给我一些指示链接,那就太好了。
感谢。
答案 0 :(得分:0)
我假设W的条目是正面的;在你的问题的上下文中,负数没有多大意义(因为你在1处而不是-1处截断),而零没有贡献,可以用nonzeros
命令删除。
以下是解决问题的方法:
这是一个实现。 candidates
是a = W(i)得到的总和的各种值,如上所述。
W = [3 1 4 1 5 9 2 6 5 3]; M = 7; % test data
n = numel(W);
sorted = sort(W);
cs = cumsum(sorted);
candidates = cs./sorted+(n-1:-1:0); % what you get with a = sorted(i)
i = find(candidates>=M, 1, 'last');
if (numel(i)==0)
disp('No solution'); % M is too big
else
a = cs(i)/(M-(n-i)) % from the equation cs(i)/a + (n-i) = M
disp(min(W/a,1)); % for confirmation of correctness
disp(sum(min(W/a,1))); % for confirmation of correctness
end
返回
a = 4.6667
0.6429 0.2143 0.8571 0.2143 1.0000 1.0000 0.4286 1.0000 1.0000 0.6429
7