%% Problem % % min 1/2 || x - v||^2 % s.t. x>=0, 1'x=k % if nargin < 2 k = 1; end; ft=1; n = length(v); v0 = v-mean(v) + k/n; %vmax = max(v0); vmin = min(v0); if vmin < 0 f = 1; lambda_m = 0; while abs(f) > 10^-10 v1 = v0 - lambda_m; posidx = v1>0; npos = sum(posidx); g = -npos; f = sum(v1(posidx)) - k; lambda_m = lambda_m - f/g; ft=ft+1; if ft > 100 x = max(v1,0); break; end; end; x = max(v1,0); else x = v0; end;
时间: 2023-11-26 09:05:38 浏览: 55
cmake-rpm-macros-3.20.2-1.el8.noarch.rpm
这是一个最小化二次范数的问题,其中有两个约束条件:$x \geq 0$ 和 $1^T x = k$。如果没有传入 $k$ 的值,则默认为 $1$。算法会先对输入向量 $v$ 进行平移,使其平均值为 $k/n$,其中 $n$ 为 $v$ 的长度。然后算法会进行迭代,直到找到满足约束条件的最小值。具体地,算法会先将 $v$ 向下平移 $\lambda_m$,其中 $\lambda_m$ 是一个逐步更新的步长,然后将负值置为 $0$,然后重新计算函数值和梯度。如果函数值的绝对值小于 $10^{-10}$,则算法终止。如果迭代次数超过 $100$ 次,则直接将 $v$ 的非负部分作为最终解。
阅读全文