2016-08-28 6 views
0

私はMatlabでnewbyです。私は複雑なif-statementの作業コードを取り、それを書き直す必要があります。このコードでは、最適化タスクを解決するための初期データを用意する必要があります。このif-statement条件は次のようになります。if-statement:matlabで書き直す方法

x=[784.8 959.2 468 572 279 341 139.5 170.5 76.5 93.5 45 55]; 
a=nchoosek(x,6); % all possible combinations from 6 elements of x 
n=length(a); 
q=[]; 

for i=1:n 

if(((a(i,1)==x(1)) & (a(i,2)==x(2))) | 
    ((a(i,1)==x(3)) & (a(i,2)==x(4))) | 
    ((a(i,1)==x(5)) & (a(i,2)==x(6))) | 
    ((a(i,1)==x(7)) & (a(i,2)==x(8))) | 
    ((a(i,2)==x(3)) & (a(i,3)==x(4))) | 
    ((a(i,2)==x(5)) & (a(i,3)==x(6))) | 
    ((a(i,2)==x(7)) & (a(i,3)==x(8))) | 
    ((a(i,3)==x(3)) & (a(i,4)==x(4))) | 
    ((a(i,3)==x(5)) & (a(i,4)==x(6))) | 
    ((a(i,3)==x(7)) & (a(i,4)==x(8))) | 
    ((a(i,3)==x(9)) & (a(i,4)==x(10)))| 
    ((a(i,4)==x(5)) & (a(i,5)==x(6))) | 
    ((a(i,4)==x(7)) & (a(i,5)==x(8))) | 
    ((a(i,4)==x(9)) & (a(i,5)==x(10)))| 
    ((a(i,5)==x(5)) & (a(i,6)==x(6))) | 
    ((a(i,5)==x(7)) & (a(i,6)==x(8))) | 
    ((a(i,5)==x(9)) & (a(i,6)==x(10)) | 
    ((a(i,5)==x(11)) & (a(i,6)==x(12))))) 
    q(i,:)=a(i,:); 
end; 
end; 
q; 
R1=a-q; 
R1(~any(R1,2),:) = []; 
R1(:, ~any(R1)) = []; 

質問:誰もがコードの可読性を向上させるためにif-statementを書き換える方法のアイデアを与えるだろうか?

+0

条件の森は誰のためにほぼ不可能になることができますが、簡単にするために;これらのコンポーネントの背後には意味がありません。しかし、1つの提案は、前者が短絡(恐らく)し、後者が短絡するため、ビット操作ではなく論理を使用します。 –

+0

最後の行は1つのORケースであり、前の行にはそれぞれ2つのケースが含まれています。これはあなたのconditonsのsectioning(私は1つのトップレベルまたはラインごとに1つを使用する)から些細なものではなく、あなたの側でもエラーかもしれません。 –

+2

最終的な点:配列の順列を別の配列と比較する場合、値そのものではなくインデックスを生成してみてください。その場合、整数の等価性をテストできます(who-knows-whatsではなく)。 –

答えて

2

私が正しくあなたを理解している場合、どのようなif文複雑なことは基本的に

If "x(1) x(2)" or "x(3) x(4)" or ... "x(11) x(12)" appears anywhere consecutively in row i 

はそれについて考えると言う:

((a(i,1)==x(1)) & (a(i,2)==x(2))) | ((a(i,1)==x(3)) & (a(i,2)==x(4))) | 
((a(i,1)==x(5)) & (a(i,2)==x(6))) | ((a(i,1)==x(7)) & (a(i,2)==x(8))) 

は違いはありません:[x(9) x(10)]以来

((a(i,1)==x(1)) & (a(i,2)==x(2))) | ((a(i,1)==x(3)) & (a(i,2)==x(4))) | 
((a(i,1)==x(5)) & (a(i,2)==x(6))) | ((a(i,1)==x(7)) & (a(i,2)==x(8))) | 
((a(i,1)==x(9)) & (a(i,2)==x(10))) | ((a(i,1)==x(11)) & (a(i,2)==x(12))) 

[x(11) x(12)]a(i, 1:2)に表示されないため、追加したのは常に偽であり、OR連鎖の結果を変更しません。しかし、ifは論理をはるかに理解しやすくします。同じロジックがa(i,2:3), a(i,3:4)...に適用されます。これらのケースも完了してから、私はこの回答で最初に述べたステートメントを取得します。

その後、代わりにxから直接aを生成するので、あなたのような、xINDEX、すなわち[1:12]からaを生成する必要があります:

a = nchoosek(1:length(x), 6); 

なぜ?あなたはxが実数で構成されていて、==を実数で使用しても成功を保証するものではありません。一般的には非常に悪い習慣です。

はその後、あなたの目標は、次のようになりますと同等です

find if sequence `[1 2]` or `[3 4]` or `[5 6]` ... exists in each line of `a` 

find if there is any odd number n followed by n+1 

このロジックは、のように表すことができる:今

success = any (mod(a(:,1:end-1), 2) & diff(a,1,2)==1, 2) 

success(i)は用true/falseになりますあなたの声明が評価するすべてのa(i)同じ値。この方法は非常に簡潔で、異なるサイズのxに自動的に適応し、ループで実行する必要がないため、文よりも優れています。

そして、あなたはx値の実際の組み合わせを取得したい場合は、単に行う

x(a(i)); % Get the ith permutation of x 
x(a);  % Get all permutation of x 
x(a(success,:)); % Get all permutation of x that satisfy the requirement. 

EDIT:

q = a;    % q is basically a copy of a 
q(~success,:) = 0; % except the `non-success` rows are zero 
x(q) - x(a)   % suppose q and a store index, this will give you the substraction. 
+0

完全な答えをありがとうが、私はあなたの解決策を受け入れることができません。私は私の質問を更新しました。 – Nick

+0

申し訳ありません、それは任意の(...、2)でなければなりません。私は私の答えを更新しました –

関連する問題