MATLAB: Vector decomposition with Matlab

MATLABsplitvector

Hello !
I want to split a vector b, in two parts, b1 and b2, like that:
b= [2; 1; 2; 1; 0; 1; 2; 1; 2]
b1=[2; 1; 1; 1; 0; 0; 1; 0; 0]
b2=[0; 0; 1; 0; 0; 1; 1; 1; 2]
But my code, work only for n=4; for n>4, don't work fine.
n=4;
b=zeros((n-1)^2,1);
b(1)=2;
b(2:(n-2))=ones(n-3,1);
b(n-1)=2;
for i=1:n-3
b((n-1)*i+1)=1;
b((n-1)*(i+1))=1;
end
b((n-1)*(n-2)+1)=2;
b((n-1)*(n-2)+2:(n-1)*(n-2)+n-2)=ones(n-3,1);
b((n-1)^2)=2;
b1(1)=2;
b1(2:(n-2))=1;
b1(n-1)=1;
for i=1:n-3
b1((n-1)*i+1)=1;
b1((n-1)*(i+1))=0;
end
b1((n-1)*(n-2)+1)=1;
b1(n*2:(n-1)*(n-2))=0;
b1((n-1)*(n-2)+2:(n-1)*(n-2)+n-2)=zeros(n-3,1);
b1((n-1)^2)=0;
b2(1)=0;
b2(2:(n-2))=0;
b2(n-1)=1;
b2((n-1)*(n-2))=1;
b2((n-1)*(n-2)+1)=1;
b2((n-1)*(n-2)+2:(n-1)*(n-2)+n-2)=ones(n-3,1);
b2((n-1)^2)=2;

Best Answer

b= [2; 1; 2; 1; 0; 1; 2; 1; 2]
b1=min(b,1);
b1([find(b==2,1,'first'),find(b==2,1,'last')])=2;
b2=b-b1;
n=length(b);
tail=floor(n/2)+1:n; %or ceil?
[b1(tail),b2(tail)]=deal(b2(tail),b1(tail));
b1
b2