【问题标题】:A code find all combination pattern [duplicate]一个代码找到所有组合模式[重复]
【发布时间】:2017-07-18 11:41:37
【问题描述】:

我想创建所有可能发生的模式组合

例如,我有三个球,我想选 3 次。所有可能的是 27 个事件,但我想像这样在数组中创建所有可能的事件 [1 1 1; 1 1 2; 1 1 3; 1 2 1 ;....]

谁能帮我在matlab程序中写m文件?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    这可以通过基本转换非常容易地完成。

    如果球数不超过10

    M = 3; % Number of balls. Must not exceed 10
    N = 3; % Number of draws
    result = dec2base(0:M^N-1, M)-'0'+1;
    

    请注意,dec2base 输出的是字符,而不是数字,因此是 -'0' 部分。算术运算中的字符的行为类似于其对应的 ASCII 码。所以减去'0' 会将字符'0''1'、...、'9' 转换为相应的数字。

    使用这种方法,M 不能超过 10,因为这样dec2bin 将输出 '0', '1', ..., '9', 'A', 'B' ... 和字符对于'A''B',算术不会给出正确的结果...但这可以通过以下方式轻松解决。

    球数不超过36

    M = 12; % Number of balls. Must not exceed 36
    N = 2; % Number of draws
    result = dec2base(0:M^N-1, M)-'0'+1; % same as before
    result = result - ('A'-'9'-1)*(result>10); % correction
    

    新行只是通过减去'A'-'9'-1 来更正'A''B' 的结果,以补偿'9''A' 没有连续的ASCII 代码这一事实。

    由于dec2base 的限制,使用这种方法M 不能超过36

    【讨论】:

    • @LeanderMoesinger 算术运算中的字符的行为类似于其对应的 ASCII 代码。例如'2'50 相同,'0'48,因此'2'-'0' 给出2。通常,减去'0' 会将数字字符转换为相应的数字。我添加了解释
    【解决方案2】:

    您可以为特定情况创建这样的结果:

      firstCol = [ones(9,1);2*ones(9,1);3*ones(9,1)];
      secondCol = repeat([ones(3,1);2*ones(3,1);3*ones(3,1)],1,3);
      thirdCol = repeat([1;2;3],1,9);
      result = [firstCol secondCol thirdCol];
    

    首先,对第一列重复 9 次 1,2 和 3。然后为第二列重复它们中的每一个 3 次,并为每个项目选择第三列一次。实际上,这会为每个位置生成所有可能的选择。

    怎么样?如果您假设第一个元素是 1,那么您有 3 个选择第二个位置,3 个选择第三个位置。因此,当第一名是 1 时,您有 9 个可能的选项。另外,固定第二名,然后分析它。您可以将其概括为 2 和 3。上面的代码,尝试根据此解释生成可能性。

    在上面,ones 生成一个所有元素为 1 且具有指定大小的矩阵,repeat 函数以指定的大小和维度重复指定的矩阵。您可以查看文档以了解更多信息。

    因此,您可以将其概括n,如下所示:

     n = 10;
     result = zeros(3^n,3);
     for idx = 1:n
         result(:,idx) = repeat([ones(3^(n-idx),1);2*ones(3^(n-idx),1);3*ones(3^(n-idx),1)],1,3^(idx-1));
     end
    

    【讨论】:

    • 感谢您的回答。如果我换成这样的另一个问题。我有三个球,我想选n次。所以可能的事件是 3^n。如何在数组中创建所有事件?
    • @kengSurawit 查看更新后的帖子。
    • 我的 Matlab 2013 中没有重复命令。你有任何代码来概括这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 2013-11-27
    • 1970-01-01
    • 2014-06-30
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多