我想创建可能发生的所有模式组合
例如,我有三个球,我想选3次。所有可能的是27个事件,但我想在这样的数组中创建所有可能的事件
[1 1 1; 1 1 2; 1 1 3; 1 2 1 ;....]
任何人都可以帮我在matlab程序中编写m文件吗?
答案 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