代码找到所有组合模式

时间:2017-07-18 11:41:37

标签: matlab

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

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

任何人都可以帮我在matlab程序中编写m文件吗?

2 个答案:

答案 0 :(得分: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',{ {1}},'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''B',...的结果,以补偿'A'-'9'-1'9'这一事实没有连续的ASCII码。

由于'A'限制,此方法M不能超过36

答案 1 :(得分:0)

您可以为特定情况

创建如下结果
  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