```% Section 8.1.1, Boyd & Vandenberghe "Convex Optimization"
% Joelle Skaf - 10/07/05
%
% The projection of x0 on a rectangle C = {x | l <= x <= u} is given by
%           minimize || x - x0 ||^2
%               s.t.    l <= x <= u
% It is also given by P_C(x0)_k = l_k       if  x0_k <= l_k
%                                 x0_k      if  l_k <= x0_k <= u_k
%                                 u_k       if  x0_k >= u_k

% Input data: generate vectors l and u such that l < 0 < u
n  = 10;
l  = -rand(n,1);
u  = rand(n,1);
x0 = randn(n,1);

% Analytical solution
fprintf(1,'Computing the analytical solution ...');
pc_x0 = x0;
pc_x0(find(x0<=l)) = l(find(x0<=l));
pc_x0(find(x0>=u)) = u(find(x0>=u));
fprintf(1,'Done! \n');

% Solution via QP
fprintf(1,'Computing the optimal solution by solving a QP ...');

cvx_begin quiet
variable x(n)
minimize ( norm(x-x0) )
x <= u;
x >= l;
cvx_end

fprintf(1,'Done! \n');

% Verification
disp('-----------------------------------------------------------------');
disp('Verifying that the analytical solution and the solution obtained via QP are equal: ');
[pc_x0 x]
```
```Computing the analytical solution ...Done!
Computing the optimal solution by solving a QP ...Done!
-----------------------------------------------------------------
Verifying that the analytical solution and the solution obtained via QP are equal:

ans =

-0.2028   -0.2028
-0.1987   -0.1987
0.5252    0.5252
-0.0562   -0.0562
0.5135    0.5136
0.3967    0.3967
0.0196    0.0196
0.4005    0.4006
-0.9318   -0.9318
0.3750    0.3751

```