看板 MATLAB 關於我們 聯絡資訊
※ 引述《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
punkdog:版上好多強者 推推 09/29 20:13
immomo808:iSet=randperm(73);iSet=iSet(1:30);不知道會不會比較好 09/30 01:36
mp19990920:我印象中若用randperm取前k個值這樣來做的話,iSet不會 09/30 01:42
mp19990920:uniform的取(我以前好像有測過但現在不敢肯定) 09/30 01:44
immomo808:uniform是指機率差不多嗎? 不過matlab全部都是假的隨機 09/30 01:45
immomo808:所以應該不管怎麼做都不太均勻吧? 09/30 01:45
法三:(感謝immomo808大提供) iSet = randperm(73, 30); 優:內建函數,很快 缺:無 p.s. PC內得到的random是假的沒錯, 但假的很真, 我的意思是在產生random時要小心, 別因程式流程而破壞了原本的性值。 ※ 編輯: mp19990920 來自: 111.67.55.249 (09/30 12:01)
sunev:randperm應該沒有問題,不然rand也會有問題。 09/30 11:57
fly1102:感為各位強者!!!問題已得到解決~ 09/30 15:18
immomo808:感謝mp19990920大,我也去查了seed的資料 獲益良多:) 09/30 16:31