假设我有这个工作示例:
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 个值。谁能帮我找到一个快速的算法来做到这一点?