2013-01-24 82 views
1
if male(m,7)==0||male(m,7)==1 
     if female(f,7)==0||female(f,7)==1 
      Wfst = 1; 
     end 
     if female(f,7)==2||female(f,7)==3||female(f,7)==4 
      Wfst = 1/2; 
     end 
     if female(f,7) == -1 
      Wfst = 1/2; 
     end 
    end 

    if male(m,7)==2||male(m,7)==3||male(m,7)==4 
     if female(f,7)==0||female(f,7)==1 
      Wfst = 0; 
     end 
     if female(f,7)==2||female(f,7)==3||female(f,7)==4 
      Wfst = 1; 
     end 
     if female(f,7) == -1 
      Wfst = 1/2; 
     end 
    end 

任何人都可以提出處理有條件分配較短方法。我發佈了我正在處理的實際代碼。Matlab的有條件分配

+2

[在Matlab有條件分配]的可能的修訂(http://stackoverflow.com/questions/14498363/conditional-assignment-in-matlab)。刪除你的一個問題。 –

回答

4

您可以使用switch/case使用MATLAB函數all。就像這樣:

switch male(m, 7) 
    case {0, 1} 
     switch female(f,7) 
      case {0, 1} 
       Wfst = 1; 
      case {2, 3, 4} 
       Wfst = 1/2; 
      case -1 
       Wfst = 1/2; 
     end 
    case {2, 3, 4} 
     switch female(f,7) 
      case {0, 1} 
       Wfst = 0; 
      case {2, 3, 4} 
       Wfst = 1; 
      case -1 
       Wfst = 1/2; 
     end 
end 

這不是比你短,但很容易理解。

+1

+1的可讀性! – Jonas

1

我不認爲這真的簡化了它很多,但也許你可以拿出它的一些元素,所以這裏是一個1個班輪包圍相同的邏輯:

M = male(f, 7) 
F = female(f, 7) 
Wfst = (M < 2) * (1 - any(F == [-1 2:4])*0.5) + (M > 1) * ((F == -1)*0.5 + any(F == 2:4)) 

所以基本思路是, Matlab的邏輯類型變量整數類型的隱式轉換與真正的爲1,零是假的,所以你可以只乘的條件。

例如:

if (a > 10) 
    b = 5; 
else 
    b = 10; 
end 

相同

b = (a > 10)*5 + ~(a > 10)*10; 

這簡化到

b = 10 - (a > 10)*5; 
3

可以更換

a == n1 || a == n2 || a == n3 

any(a == [n1, n2, n3]) 

在同樣的精神,面向未來,如果你碰巧有&&而非||,可以代替any