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

作者: runkong (米塔克)   2017-05-25 01:29:21
您好,經過這兩天的嘗試,目前大概寫出一個大迴圈,但還有一些小疑問
※ 引述《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

Links booklink

Contact Us: admin [ a t ] ucptt.com