【发布时间】:2014-02-25 08:32:37
【问题描述】:
如何生成一个矩阵,其中所有可能的数字组合总计为重复的总和?
基本上,x1、x2、x3 的组合使得x1 + x2 + x3 = n。
例如:n =3
0 1 2
0 2 1
1 0 2
1 2 0
1 1 1
有没有使用预定义的 Matlab 函数的简单方法?
我试过了
n=6;
nchoosek(0:n,3)
这给了我
0 1 2
0 1 3
0 1 4
0 1 5
0 1 6
0 2 3
0 2 4
0 2 5
0 2 6
0 3 4
0 3 5
0 3 6
0 4 5
0 4 6
0 5 6
1 2 3
1 2 4
1 2 5
1 2 6
1 3 4
1 3 5
1 3 6
1 4 5
1 4 6
1 5 6
2 3 4
2 3 5
2 3 6
2 4 5
2 4 6
2 5 6
3 4 5
3 4 6
3 5 6
4 5 6
如何提取总数等于n 的所有行?
我认为线性索引或find 应该可以实现,但我不知道该怎么做。
问候
【问题讨论】:
-
您将使用逻辑索引:
result = c(sum(c,2)==n,:);,其中c是nchoosek的结果。但是nchoosek不会这样做,因为它不会重复 -
@LuisMendo 真的,谢谢!
-
执行此操作的标准方法是想象将两个分隔线放入一行 6 个对象中,以获得 3 个单独的分区。因此,您正在考虑置换 8 个事物:6 个对象和 2 个分隔符的组合。您应该能够操纵例如
nchoosek(1:8, 2)的结果来满足您的需求。这比生成所有组合并选择具有正确总和的组合要高效得多。 -
例如,这里是 Python 中对应的东西:
[(a, b-a-1, 7-b) for a, b in itertools.combinations(range(8), 2)]。 (我这里没有 Matlab 可供试验,但你或其他人也许可以翻译这个。)
标签: matlab combinations permutation