作者mp19990920 (郝渴连)
标题Re: [问题] 从多维矩阵随机取数
时间Sun Sep 29 19:20:41 2013
※ 引述《fly1102 (Hh)》之铭言:
: 大家好,
: 本人将73组10*10的矩阵资料写成3D矩阵为[10*10*73]
: 现欲随机抽样统计 想随机抽取73组资料中的30组
: 但取出的资料依旧要组成一个3D矩阵[10*10*30]
: 每次抽取的资料都是不同的30组而且不重复
: 试过randperm randsample 都没办法
: 请问该怎麽写呢?
: 感谢!!
假设A为 10*10*73 的矩阵,
iSet 为 1*30 (或 30*1) 的矩阵,
其中每个值为 1~73 的数字且都不重复,
则 A(:, :, iSet) 即为你想要的结果。
其中最大的问题是在於产生iSet,
而 iSet 的所有可能性有 C(73, 30)=278940769844931007968 种。
法ㄧ:
allSet = dec2bin(0:2^73-1);
allSet = allSet(sum(allSet, 2) == 73*double('0')+30, :);
iSet = allSet(ceil(size(allSet, 1)*rand), :)=='1';
优:等机率的从所有可能中取出一组
缺:记忆体用量极~极~极~大!!!
法二:
iSet = getset(73, 30);
function iSet = getset(n, k);
while(1)
iSet = unique(ceil(n*rand(1, k)));
if length(iSet) == k
break;
end
end
end
优:记忆体用量小
缺:(1)每次跑出来结果的执行时间差异很大
(2)取出的机率我暂时不能确定是uniform的
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.67.55.249
1F:推 punkdog:版上好多强者 推推 09/29 20:13
2F:推 immomo808:iSet=randperm(73);iSet=iSet(1:30);不知道会不会比较好 09/30 01:36
3F:→ mp19990920:我印象中若用randperm取前k个值这样来做的话,iSet不会 09/30 01:42
4F:→ mp19990920:uniform的取(我以前好像有测过但现在不敢肯定) 09/30 01:44
5F:推 immomo808:uniform是指机率差不多吗? 不过matlab全部都是假的随机 09/30 01:45
6F:→ immomo808:所以应该不管怎麽做都不太均匀吧? 09/30 01:45
法三:(感谢immomo808大提供)
iSet = randperm(73, 30);
优:内建函数,很快
缺:无
p.s.
PC内得到的random是假的没错,
但假的很真,
我的意思是在产生random时要小心,
别因程式流程而破坏了原本的性值。
※ 编辑: mp19990920 来自: 111.67.55.249 (09/30 12:01)
7F:推 sunev:randperm应该没有问题,不然rand也会有问题。 09/30 11:57
8F:推 fly1102:感为各位强者!!!问题已得到解决~ 09/30 15:18
9F:推 immomo808:感谢mp19990920大,我也去查了seed的资料 获益良多:) 09/30 16:31