【问题标题】:Comparing arrays to find out of one is contained within another比较数组以找出一个包含在另一个中
【发布时间】:2013-03-19 00:31:14
【问题描述】:

我有以下代码:

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 数组与 rule{x} 数组进行比较,并告诉我它是否匹配。如果不匹配,它应该告诉我滚动数组的哪些索引与规则数组不匹配。但是它不能正常工作。假设示例滚动是 [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

主函数将其称为:

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

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

【问题讨论】:

  • 查看this帖子
  • 你的 ruleFunc 数组中有什么?
  • 即具有直方图规则的数字数组。我认为它实际上工作正常。只是休息;当我想要它时,它似乎没有破裂。我测试了很多次,最终让它工作了。关于如何重新计算不符合规则的数字。
  • ForwardChainingRule 返回 scoreCode,它是 ruleFunc 的一个元素。但是如果 ruleFunc 是一个直方图列表,那么它们都不是数字 12
  • ruleFunc 每隔一行就有上一行给出的分数。所以第一行是 5 0 0 0 0 0 0,第二行是 12。12 被传递回原始函数,被解释为掷骰子的分数。虽然这里的这个例子真的很粗糙。我正在一步一步地慢慢开发附加功能,但要确保程序作为一个整体运行,所以如果我没有完成所有工作,我有一些东西要上交。

标签: arrays matlab compare


【解决方案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, 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:哎呀,弄错了,它说第二个参数必须排序。改回来。

【讨论】:

  • 您能否详细说明一下,或者如果您是在与一年级学生交谈,请改写一下?我是一个完整的数学菜鸟,不太明白你在说什么。
  • 好的,有道理。因此,您提供的第一行示例代码将获取 5 个元素的数组并计算其中有多少个元素并将它们存储到数组 a 中?
  • 是的,这正是我正在做的(假设这些元素是 6 面骰子。如果你有更多面的骰子,你可能需要将 6 改得更大)
  • 如果包含滚动的数组的名称是“滚动”,我将替换它的哪个部分?
  • 其实我注意到matlab有一个“histc”函数。让我改正我的答案以改用它
【解决方案2】:

我不确定您的数组到底在做什么,但如果您有 [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)

【讨论】:

  • “==”会在索引到索引的基础上比较元素吗?如果是这样,那将不起作用,因为某些规则在索引中只有 4 个元素。
猜你喜欢
  • 2013-05-06
  • 1970-01-01
  • 2019-08-12
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
相关资源
最近更新 更多