2017-07-02 67 views
0

原理: 我有一個碼字ü,我想改變你的4位的所有2位。如何修改碼字中的兩位?

例如:如果u = [1 1 0 0],我想獲得:

u1 = [0 0 0 0] ; u2 = [0 1 1 0] ; u3 = [0 1 0 1]; 
u4 = [1 0 1 0] ; u5 = [1 0 0 1] ; u6 = [1 1 1 1]; 

計劃:

u = rand(1,4)>0.5 
for i = 1:size(u,2) 
    if u(:,1)==0 && u(:,2)==0 
     u1 = [1 1 u(:,3) u(:,4)]; 
    elseif u(:,1)==1 && u(:,2)==0 
     u1 = [0 1 u(:,3) u(:,4)]; 
    elseif u(:,1)==0 && u(:,2)==1 
     u1 = [1 0 u(:,3) u(:,4)]; 
    elseif u(:,1)==1 && u(:,2)==1 
     u1 = [0 0 u(:,3) u(:,4)]; 
    end 

    if u(:,1)==0 && u(:,3)==0 
     u2 = [1 u(:,2) 1 u(:,4)]; 
    elseif u(:,1)==1 && u(:,3)==0 
     u2 = [0 u(:,2) 1 u(:,4)]; 
    elseif u(:,1)==0 && u(:,3)==1 
     u2 = [1 u(:,2) 0 u(:,4)]; 
    elseif u(:,1)==1 && u(:,3)==1 
     u2 = [0 u(:,2) 0 u(:,4)]; 
    end 

    if u(:,1)==0 && u(:,4)==0 
     u3 = [1 u(:,2) u(:,3) 1]; 
    elseif u(:,1)==1 && u(:,4)==0 
     u3 = [0 u(:,2) u(:,3) 1]; 
    elseif u(:,1)==0 && u(:,4)==1 
     u3 = [1 u(:,2) u(:,3) 0]; 
    elseif u(:,1)==1 && u(:,4)==1 
     u3 = [0 u(:,2) u(:,3) 0]; 
    end 

    if u(:,2)==0 && u(:,3)==0 
     u4 = [u(:,1) 1 1 u(:,4)]; 
    elseif u(:,2)==1 && u(:,3)==0 
     u4 = [u(:,1) 0 1 u(:,4)]; 
    elseif u(:,2)==0 && u(:,4)==1 
     u4 = [u(:,1) 1 0 u(:,4)]; 
    elseif u(:,2)==1 && u(:,3)==1 
     u4 = [u(:,1) 0 0 u(:,4)]; 
    end 

    if u(:,2)==0 && u(:,4)==0 
     u5 = [u(:,1) 1 u(:,3) 1]; 
    elseif u(:,2)==1 && u(:,4)==0 
     u5 = [u(:,1) 0 u(:,3) 1]; 
    elseif u(:,2)==0 && u(:,4)==1 
     u5 = [u(:,1) 1 u(:,3) 0]; 
    elseif u(:,2)==1 && u(:,4)==1 
     u5 = [u(:,1) 0 u(:,3) 0]; 
    end 

    if u(:,3)==0 && u(:,4)==0 
     u6 =[u(:,1) u(:,2) 1 1]; 
    elseif u(:,3)==1 && u(:,4)==0 
     u6 =[u(:,1) u(:,2) 0 1]; 
    elseif u(:,3)==0 && u(:,4)==1 
     u6 =[u(:,1) u(:,2) 1 0]; 
    elseif u(:,3)==1 && u(:,4)==1 
     u6 =[u(:,1) u(:,2) 0 0]; 
    end 
end 

我需要我的程序推廣到u的所有長度,使其短,因爲如果長度你很大很難以這種方式進行。

有人可以幫助我概括我的程序,並使其更短?

謝謝!

回答

2

一個簡單的解決辦法是:

u = [1 1 0 0]; 
    us = []; % all possible u 
    k = 2; 
    n = length(u); 
    C = nchoosek(1:n,k); 
    notC = ~u(C); % flip value of the specified elements of u 
    for i = 1:size(notC,1) 
     uTemp = u; 
     uTemp(C(i,:)) = ~u(C(i,:)); 
     us = [us; uTemp]; 
    end