【发布时间】:2013-11-08 15:16:51
【问题描述】:
假设我有这个工作示例:
lover_bound = 10;
upper_bound = 180;
steps = 10;
NumeroCestelli = 8;
livello = [lover_bound:steps:upper_bound];
L = length(livello);
n_c = ceil((factorial(L+NumeroCestelli-1))/(factorial(NumeroCestelli)*factorial(L-1)));
randIdxs = randi([1,L],n_c,NumeroCestelli);
PianoSperimentale = single(livello(randIdxs));
我需要执行一个n_c x NumeroCestelli 矩阵(称为PianoSperimentale),其中每一行都是唯一的。不允许任何形式的排列。使用 randi 我无法执行我的要求。
[10 20 30 40 50 60 70 80] is equal to [80 70 60 50 40 30 20 10]
PianoSperimentale 应该是一个1081575x8 矩阵。过去我使用Combinator) 函数,但对于非常大的矩阵来说非常慢。
[PianoSperimentale] = combinator(L,NumeroCestelli,'c','r');
for i=1:L
PianoSperimentale(PianoSperimentale==i)=livello(i);
end
那么,有一种方法可以执行与combinator 相同的矩阵,但速度为randi?
编辑:我允许选择相同的数字两次 (NumberOfCombinations = (NumeroCestelli+L-1)!/(NumeroCestelli!(L-1)!)
建议的修改
我需要生成从 18 个元素的向量中选择任何 8 个数字时获得的完整组合(带有重复项)。这可以通过使用Combinator 函数来完成,但对于非常大的矩阵来说非常慢。任何人都可以建议一种更快的方法来生成它吗?
示例:使用“来自向量 4 的样本 3”会产生以下结果:
1 1 1
1 1 2
1 1 3
1 1 4
1 2 2
1 2 3
1 2 4
1 3 3
1 3 4
1 4 4
2 2 2
2 2 3
2 2 4
2 3 3
2 3 4
2 4 4
3 3 3
3 3 4
3 4 4
4 4 4
我知道对于一个由 18 个元素组成的向量,从中选择了 8 个元素,我将得到总共 (18+8-1)!/8!*(18-1)! 个可能的组合,或 1081578 行 8 个值。谁能帮我找到一个快速的算法来做到这一点?
【问题讨论】:
-
那么...问题是什么?
-
@Dan 我需要执行一个
n_c x NumeroCestelli矩阵[...],其中每一行都是唯一的,不使用组合器。 -
@Dan 我认为 gmeroni 需要随机生成数字行,其中每个生成的行都是唯一的“模”排列