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 函数all代替any

于 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,零为 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 回答