比较数组以找出一个数组包含在另一个数组中

时间:2013-03-19 00:31:15

标签: arrays matlab compare

我有以下代码:

while rounds<=5
    fprintf('Rolling the dice...\n');
    roll=randi(6,1,5);
    roll=sort(roll);
    fprintf('You rolled:');
    disp(roll);
    rollCount=rollCount+1;

    for x=1:2:17
        y=all(ismember(roll,rule{x}))
        disp(ismember(roll,rule{x}));

        z=all(ismember(rule{x},roll))
        disp(ismember(rule{x},roll));
        rounds=rounds+1;
    end
end 

它应该做的是将roll数组与规则{x}数组进行比较,并告诉我它是否匹配。如果它不匹配,它应该告诉我roll数组的哪些索引与规则数组不匹配。然而,它无法正常工作。假设示例滚动为[2 2 3 5 5],规则{x}为[1 2 3 4 5]。

我想要的输出是一个具有[0 1 1 0 1]的数组,但是我从y中得到的是[1 1 1 1 1],而z是[0 1 1 0 1]。这似乎是正确的输出,但如果我们将规则更改为[5 5 5 5 5],我得到[1 1 1 1 1]这是不正确的。

这是我正在写的Yahtzee游戏。掷骰就是骰子的滚动,规则是我想要匹配的规则所以我可以看到我需要重新滚动以尝试让它匹配。

编辑: 使用dspyz中的代码,我编写了函数:

function[scoreCode]=ForwardChaining(rollFunc,ruleFunc)
temp=histc(rollFunc,1:6);

for x=1:2:11
    if (ruleFunc{x}<=temp)
        scoreCode=ruleFunc{x+1};
        break;        
    else scoreCode=0;
    end    
end

main函数将其称为:

c= ForwardChaining(roll,rule);
    if c == 12;
        break;
    end

但出于某种原因,即使经过100,000次迭代,也不会停止,因为它没有按预期工作。

2 个答案:

答案 0 :(得分:1)

由于骰子只能采用1到6的值。为什么不生成每个卷的直方图计数。

即取你的(行)矢量卷v并说

a = histc(roll, 1:6);

现在,如果你想检查规则是否是a的一个子集(规则本身也是根据每个数字的计数表达的话),你可以检查是否

rule <= a

如果在所有6个指数中都是如此,则滚动满足规则

澄清:

我不知道一年级学生,但给定一组(可能重复的)值,例如[1,1,2,4,5],其中一切都是1到6,我们可以代表这个通过计算从1到6的每个数字的数量。在这个例子中:

1: 2
2: 1
3: 0
4: 1
5: 1
6: 0

现在我们想要将它与相同形式的规则进行比较,但可能需要更少的元素。例如[1,2,3,4]。此规则的计数为

1: 1
2: 1
3: 1
4: 1
5: 0
6: 0

要检查[1,2,3,4]是否为[1,1,2,4,5]的子集,我们只需知道[1,2,3,4]的计数是否为[1,2,3,4]全部小于或等于[1,1,2,4,5]的计数。即我们想检查是否

1: 1 <= 2
2: 1 <= 1
3: 1 <= 0
4: 1 <= 1
5: 0 <= 1
6: 0 <= 0

所有这些都是正确的,除了3,所以我们知道[1 2 3 4]不是[1 1 2 4 6]的子集,因为它不包含3

但如果所有6个不等式都为真,则它将是

离。如果你想知道[1 3 3 3 5]是否包含[3 3 3],你可以检查所有

1: 0 <= 1
2: 0 <= 0
3: 3 <= 3
4: 0 <= 0
5: 0 <= 1
6: 0 <= 0

这是真的

编辑:看看MATLAB的文档,它说必须对histc的参数进行排序

编辑2:糟糕,错了,它说第二个参数必须排序。改回来。

答案 1 :(得分:0)

我不确定你的数组究竟在做什么,但如果你有[2 2 3 5 5]并且规则{x}是[1 2 3 4 5],你就会这样做,只需:

[2 2 3 5 5] == [1 2 3 4 5]会得到[0 1 1 0 1]或类似A =(roll == rule)