Re: [請益]選取會增質的變數作成陣列與迴圈問題

看板MATLAB作者 (Veritas)時間7年前 (2017/05/23 01:44), 編輯推噓1(103)
留言4則, 1人參與, 最新討論串2/4 (看更多)
※ 引述《runkong (米塔克)》之銘言: : 小弟是matlab新手, : 這幾天遇到了兩個迴圈和變數的問題實在搜不到類似的討論, : 因此想請教板上的各位大大。 : 這是一個模擬評選的模型 : 會有3~8個隨機數量的參賽者 : 總評審數量是由2~17位隨機出現,A就是他們的評分模式 : 其中會有總評審人數會有0~總評審人數的特殊評審,B就是他們的評分模式 : 原本的input是如下所示 : B_1(1) = 1 ; : B_1(2:z_nub(n)) = randsample (ww_x,(z_nub(n)-1)) ; : B_2(1) = 1 ; : B_2(2:z_nub(n)) = randsample (ww_x,(z_nub(n)-1)) ; : B_3(1) = 1 ; : B_3(2:z_nub(n)) = randsample (ww_x,(z_nub(n)-1)) ; 以上三個B可疊在一起寫成 B=[1 randsample(ww_x,(z_nub(n)-1)) 1 randsample(ww_x,(z_nub(n)-1)) 1 randsample(ww_x,(z_nub(n)-1))]; 可寫成迴圈形式 for i=1:3 B(i,:)=[1 randsample(ww_x,(z_nub(n)-1))]; end : A_4(1) = 1 ; : A_4(2:z_nub(n)) = randsample (ww_x,(z_nub(n)-1)) ; : A4(n)=randsample(first_place,1); : A_4(1)=A_4(A4(n)); A_4(A4(n)) = 1; 你A4有必要留下來嗎? 如果不用留可以寫成 t=randsample(first_place,1); A_4([1 t])=A_4([t 1]); : A_5(1) = 1 ; : A_5(2:z_nub(n)) = randsample (ww_x,(z_nub(n)-1)) ; : A5(n)=randsample(first_place,1); : A_5(1)=A_5(A5(n)); A_5(A5(n)) = 1; for i=1:2 A(i,:)=[1 randsample(ww_x,(z_nub(n)-1))]; t=randsample(first_place,1); A(i,[1 t])=A(i,[t 1]); end : 第一個問題是每個評審分別都會對不同參賽者排序 : 假設來5位參賽者那就是評審會隨機評1~5名 : 可能會有以下情況 : B_1得到[1,2,5,3,4] : B_2得到[1,5,4,3,2] : B_3得到[1,4,5,3,2] : A_4得到[3,4,5,1,2] : A_5得到[4,3,2,5,1] : 我希望他能夠自行將 總評審數量由1跑到17, : 並搭配特殊評審由0跑到該次的總評審數量做組合搭配 : 當B=3 A=5時,他能跑出上面那5個陣列, : 想用迴圈但卡住寫不出來,有人推薦我可能可以用二維陣列去寫? : 不知有沒有什麼語法可以推薦呢? 所以你要的大概是這樣? for i=1:17 for j=0:i clear A,B for k=1:i-j B(k,:)=[1 randsample(ww_x,(z_nub(n)-1))]; end for k=1:j A(k,:)=[1 randsample(ww_x,(z_nub(n)-1))]; t=randsample(first_place,1); A(i,[1 t])=A(i,[t 1]); end %% 做你想做的事 end end : 第二個問題是 : 每個評審分別都會對不同參賽者排序 : 假設來5位參賽者那就是評審會評1~5名 : 可能就會有以下情況 : B_1得到[1,2,5,3,4] : B_2得到[1,5,4,3,2] : B_3得到[1,4,5,3,2] : A_4得到[3,4,5,1,2] : A_5得到[4,3,2,5,1] : 最後每個人的排序加起來最低的就是勝者 : 會得到C=[1,2,5,3,4 : 1,5,4,3,2 : 1,4,5,3,2 : 3,4,5,1,2 : 4,3,2,5,1] 如果問題一的解法可行 這裡的C就單純是C=[A;B]; : 我會自己另外把他變成 : D=[10,18,21,15,11] 這邊的D可以寫成 D=sum(C,1); : 第二個問題就在"A和B這兩個不固定數量與長度的陣列疊加成一個矩陣" : 也就是C這個步驟我辦不到只能土法煉鋼每個狀態去更改, : 剛剛查到似乎可以使用append去串接, : 不過因為第一個問題所以沒辦法嘗試 : 且每次名稱都會由A1.A2.A3做變化因此無法使用A=1:17; : 我有看到可以用eval依照他們增質的數量去定義, : 不過自己嘗試寫了一下還是跑不出來. : 目前也算是只用土法煉鋼的方法在更改 : 麻煩各位幫忙了 兩個問題解答一個的750P 以表感謝 希望有解決你的問題 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.37.170.221 ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1495475090.A.F86.html

05/23 16:24, , 1F
感謝解答 不過從早上一直嘗試到現在還是怪怪的
05/23 16:24, 1F

05/23 16:25, , 2F
目前分別測A和B都是可用的
05/23 16:25, 2F

05/23 16:26, , 3F
C看起來是可用的 但大迴圈怪怪的
05/23 16:26, 3F

05/23 16:27, , 4F
目前正在尋找是哪邊有問題
05/23 16:27, 4F
文章代碼(AID): #1P8oEI-6 (MATLAB)
文章代碼(AID): #1P8oEI-6 (MATLAB)