如何在X个数字的数组中找到X个数字的X个唯一组合(顺序不重要)。

33次观看(过去30天)
问题就在标题里。
谢谢!
3评论

登录评论。

接受的答案

布鲁诺陈德良
布鲁诺陈德良 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的评论
Dc215905
Dc215905 2020年8月30日
编辑:Dc215905 2020年8月30日
还有一个后续问题。假设我不想找出所有的组合,但是可能的300万个组合中的10000个。我的计算机不能经常处理每一个组合,所以我只想要一个子集。你有什么想法吗?下面有一个评论,我认为可能有助于这一点(使用rand和唯一排序),但我不确定是否有什么东西我又错过了nchoosek。
在学习了更多的术语之后-似乎我正在尝试执行一个伪delete-d jacknife,因为我不打算分析每个组合,只是其中的一部分。

登录评论。

更多答案(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,[]);
1评论
骑自行车的人
骑自行车的人 2020年8月29日
在我的机器上,这是有效的 最多24个,只需要几秒钟。为 如果比这个大,中间数组就太大了,MATLAB就会陷入困境。

登录评论。


约翰D 'Errico
约翰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。同时,您需要了解计算机的局限性。
1评论
Dc215905
Dc215905 2020年8月30日
编辑:Dc215905 2020年8月30日
谢谢你!这一切都很好。我将来肯定会经常用到它。我特别喜欢关于“独特的排序”的部分——这可能有助于解决我的失忆问题。我不需要每一个可能的组合,只需要300万个可能组合中的1万个。
在学习了更多的术语之后-似乎我正在尝试执行一个伪delete-d jacknife,因为我不打算分析每个组合,只是其中的一部分。

登录评论。

类别

了解更多字符和字符串帮助中心而且文件交换

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!

翻译的