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

看板MATLAB作者 (米塔克)時間7年前 (2017/05/25 01:29), 7年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/4 (看更多)
您好,經過這兩天的嘗試,目前大概寫出一個大迴圈,但還有一些小疑問 ※ 引述《sunev (Veritas)》之銘言: : ※ 引述《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 當初B的構想是評審於評分時,讓第一位參賽者成為第一名,其餘隨機分配。 現在有另一種B構想, 是除了讓第一位參賽者成為第一名,還要讓第二名成為最後一名,其餘隨機分配。 其原本輸入的input如下所示: B_1(1) = 1 ; B_1(2)=z_nub(n); B_1(3:z_nub(n)) = randsample (www_x,(z_nub(n)-2)) ; if z_nub(n) == 3; B_1(3)=2; end B_2(1) = 1 ; B_2(2)=z_nub(n); B_2(3:z_nub(n)) = randsample (www_x,(z_nub(n)-2)) ; if z_nub(n) == 3; B_2(3)=2; end B_3(1) = 1 ; B_3(2)=z_nub(n); B_3(3:z_nub(n)) = randsample (www_x,(z_nub(n)-2)) ; if z_nub(n) == 3; B_3(3)=2; end 依照您的改法我將他改成 www_x=2:z_nub-1; %z_nub為本次的參賽者人數 fori=1:3; B(i;:)= [1 z_nub randsample(www_x,(z_nub-2))]; if z_nub==3; B(3)=2; end 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]); 當初會將A4.A5等代號特別留下來 是因為希望每一次的迴圈當中, 每位評審都重取一個值做為他評分鐘的第一名, 不要同一次迴圈當中的每位評審選出來的第一名都是相同的。 不知道您這種寫法是共用同一個值還會各別重取呢? : : 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 原本的程式碼只能就單一組合去演算,所以我才希望能夠寫迴圈, 讓我的程式能夠得到A和B之間各個組合狀況下的東西,不用一個一個組合去演算, 因此原本的程式碼才沒有eval。 就您的回答雖然會去跑各組合狀況,但似乎不會把演算的內容留下讓我演算機率P, 因此我才去查到說有eval這條指令可以去給他編號在將其留下讓我能演算機率P。 以矩陣的方法有想過,但目前不知道該從何下手。 最後附上目前這個大迴圈的code ---------------------------------- nnn =10000 ; people = 17; for i=2:people for B=0:i A = i - B; for n=1:nnn; % 運算模型 ww_x =2:z_nub ; www_x =2:z_nub-1 ; eval(['A',num2str(A),'B',num2str(B),'_sum = zeros(1,z_nub);']); for j = 1:A tmp = [1 randsample(ww_x,(z_nub-1))]; t=randsample(first_place,1); tmp(1) = tmp(t); tmp(t) = 1; eval(['AB_',num2str(j),' = tmp(1,:)']); eval(['A',num2str(A),'B',num2str(B),'_sum =','A',num2str(A),'B',num2str(B),'_sum + AB_',num2str(j)]); end for j = 1:B tmp = [1 z_nub randsample(www_x,(z_nub-2))]; if z_nub == 3; tmp(3)=2; end eval(['AB_',num2str(j+A),' = tmp(1,:)']); eval(['A',num2str(A),'B',num2str(B),'_sum =','A',num2str(A),'B',num2str(B),'_sum + AB_',num2str(j+A)]); end end end end -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 115.43.76.217 ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1495646963.A.891.html ※ 編輯: runkong (115.43.76.217), 05/25/2017 01:30:47 ※ 編輯: runkong (115.43.76.217), 05/25/2017 01:31:14
文章代碼(AID): #1P9SBpYH (MATLAB)
文章代碼(AID): #1P9SBpYH (MATLAB)