如何在X个数字的数组中找到X个数字的X个唯一组合(顺序不重要)。
33次观看(过去30天)
显示旧的注释
接受的答案
布鲁诺陈德良
2020年8月29日
您可能错过了NCHOOSEK可以接受矢量数组作为输入的特性
> > X =兰德(1、5)
X =
0.3566 0.3205 0.8137 0.1779 0.9431
> > nchoosek (X, 3)
ans =
0.3566 0.3205 0.8137
0.3566 0.3205 0.1779
0.3566 0.3205 0.9431
0.3566 0.8137 0.1779
0.3566 0.8137 0.9431
0.3566 0.1779 0.9431
0.3205 0.8137 0.1779
0.3205 0.8137 0.9431
0.3205 0.1779 0.9431
0.8137 0.1779 0.9431
更多答案(2)
骑自行车的人
2020年8月29日
编辑:骑自行车的人
2020年8月29日
可能有更有效的方法,因为我首先发现
所有
组合,但我认为这是你想要的,在一个公认的模糊的方法。
M = 10;
N = 5;
获取是否选择每个元素的*全部*个组合,
%,其中1表示是,0表示否。
allComboIndex = dec2bin(0:2^M-1)' -' 0 ';
将上述设置减少为只选择N个元素的列
5 vecomboindex = allComboIndex(:,sum(allComboIndex)==N)
找出1的位置。
[r,~] = find(fiveecomboindex);
重塑以获得每列的N个值
fiveCombos =重塑(r,N,[]);
约翰D 'Errico
2020年8月29日
你的标题仍然太模糊,无法提供答案,但你所做的评论可能已经足够了。
假设有10个数,1:10。显然你真正的问题可能更大。(解释这些事!不要觉得你必须把所有的信息都写在标题里,要尽可能地简洁明了。问题可能会很长,这就是为什么你不仅仅有一个标题可以使用。)
现在你想从这10个数字中选择一个子集,这里每5个为一组。数字本身是对另一个数组的引用,并将用于查找对应元素的平均值。所以每个子集的简单递增顺序就足够了。你最初的问题是找到1000个这样的子集。
> > nchoosek(10、5)
ans =
252
当然,nchoosek告诉我们这是不可能的。一共有252个子集。事实上,nchoosek给了我们完整的集合。
> > nchoosek (1:10, 5)
ans =
1 2 3 4 5
1 2 3 4 6
1 2 3 4 7
1 2 3 4 8
1 2 3 4 9
10 . 1 2 3 4
1 2 3 5 6
1 2 3 5 7
1 2 3 5 8
1 2 3 5 9
1 2 3 5 10
1 2 3 6 7
...
我只是粘贴了前11个这样的子集,但是会生成252个这样的子集。
现在,假设我想用这些来求一些数字数组的平均值?首先,习惯将数组存储在多维数组中。
数据= rand(2,3,10);
这里,我可能有10个数组,每个数组的大小都是2x3。现在我决定选择tose数组的所有252个可能的子集,其中子集的大小为5,并形成这些数组的平均值。
Subsets = nchoosek(1:10,5);
Datasubs =重塑(数据(:,:,子集),(2、3、nchoosek(10、5),5]);
大小(Datasubs)
ans =
2 3 252 5
Dataave = mean(Datasubs,4);
大小(Dataave)
ans =
2 3 252
我取了所有252个可能的子集。我创建了你想要的数组集。然后求平均值。结果现在是252个数组。这是其中之一:
Dataave (:,: 1)
ans =
0.606133417842019 0.633298374281431 0.348760616827367
0.605002524439109 0.570316578527122 0.392097473426195
所以你可以很容易地在有限的范围内做你想做的事情。但我们仍然不知道真正的问题。因为显然你要用更大的数集来做这个。因此,如果你做得太大,事情当然会失败。
例如,假设您要求在大小为25的子集中找到所有大小为50的唯一数字集,当然,事情会很不幸地失败!
nchoosek (50, 25)
ans =
126410606437752
你需要了解你的计算机和你所拥有的内存的限制,以及你愿意投入的时间,让你的计算机执行一些大的事情。即使是一个小问题也会很快变大。
nchoosek (100 5)
ans =
75287520
例如,假设我有20个这样的数组要求平均,我希望找到5个元素的块的平均值。同样,你的问题太模糊了。但现在你的目标是随机选择1000个这样的集合。但你希望避免被复制。
Subs = randi(20,[2000 5]);
Subs = unique(sort(Subs,2),“行”);
大小(潜艇)
ans =
1950年5
Subs = Subs (randperm(size(Subs,1),1000),:);
我从1:20中选择整数。2000组,每组5组。然后我对它们进行排序,并使用unique来抛出副本。
最后,我随机选择了1000个这样的集合。
本质上,你只需要学会使用MATLAB。同时,您需要了解计算机的局限性。