2
  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

条件付き割り当てを処理するより短い方法を誰かが提案できますか。私が扱っている実際のコードを投稿しました。

4

3 に答える 3

4

を使用できますswitch/case。このような:

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

それはあなたのものより短くはありませんが、非常に理解しやすいです。

于 2013-01-24T11:15:09.830 に答える
3

交換できます

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

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

同様の精神で、将来のために、たまたま&&ではなくを持っている場合は、代わりに||matlab 関数を使用できますallany

于 2013-01-24T11:13:59.053 に答える
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が論理型変数を整数に暗黙的に変換し、trueが1、0がfalseになるため、条件を乗算できるということです。

例えば:

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

と同じです

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

これは単純化して

b = 10 - (a > 10)*5;
于 2013-01-24T11:13:58.723 に答える