Re: [問題] 從多維矩陣隨機取數

看板MATLAB作者 (郝渴連)時間12年前 (2013/09/29 19:20), 編輯推噓7(703)
留言10則, 6人參與, 最新討論串2/2 (看更多)
※ 引述《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

09/29 20:13, , 1F
版上好多強者 推推
09/29 20:13, 1F

09/30 01:36, , 2F
iSet=randperm(73);iSet=iSet(1:30);不知道會不會比較好
09/30 01:36, 2F

09/30 01:42, , 3F
我印象中若用randperm取前k個值這樣來做的話,iSet不會
09/30 01:42, 3F

09/30 01:44, , 4F
uniform的取(我以前好像有測過但現在不敢肯定)
09/30 01:44, 4F

09/30 01:45, , 5F
uniform是指機率差不多嗎? 不過matlab全部都是假的隨機
09/30 01:45, 5F

09/30 01:45, , 6F
所以應該不管怎麼做都不太均勻吧?
09/30 01:45, 6F
法三:(感謝immomo808大提供) iSet = randperm(73, 30); 優:內建函數,很快 缺:無 p.s. PC內得到的random是假的沒錯, 但假的很真, 我的意思是在產生random時要小心, 別因程式流程而破壞了原本的性值。 ※ 編輯: mp19990920 來自: 111.67.55.249 (09/30 12:01)

09/30 11:57, , 7F
randperm應該沒有問題,不然rand也會有問題。
09/30 11:57, 7F

09/30 15:18, , 8F
感為各位強者!!!問題已得到解決~
09/30 15:18, 8F

09/30 16:31, , 9F
感謝mp19990920大,我也去查了seed的資料 獲益良多:)
09/30 16:31, 9F

文章代碼(AID): #1II0qC0U (MATLAB)
文章代碼(AID): #1II0qC0U (MATLAB)