【发布时间】:2017-07-18 11:41:37
【问题描述】:
我想创建所有可能发生的模式组合
例如,我有三个球,我想选 3 次。所有可能的是 27 个事件,但我想像这样在数组中创建所有可能的事件
[1 1 1; 1 1 2; 1 1 3; 1 2 1 ;....]
谁能帮我在matlab程序中写m文件?
【问题讨论】:
标签: matlab
我想创建所有可能发生的模式组合
例如,我有三个球,我想选 3 次。所有可能的是 27 个事件,但我想像这样在数组中创建所有可能的事件
[1 1 1; 1 1 2; 1 1 3; 1 2 1 ;....]
谁能帮我在matlab程序中写m文件?
【问题讨论】:
标签: matlab
这可以通过基本转换非常容易地完成。
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。
【讨论】:
'2' 与50 相同,'0' 是48,因此'2'-'0' 给出2。通常,减去'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
【讨论】: