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

作者: sunev (Veritas)   2017-05-25 12:46:19
※ 引述《runkong (米塔克)》之銘言:
: 您好,經過這兩天的嘗試,目前大概寫出一個大迴圈,但還有一些小疑問
: ※ 引述《sunev (Veritas)》之銘言:
: : 以上三個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))];
這裡應該是 B(i,:)
: if z_nub==3;
: B(3)=2;
這一行應該是B(i,3)=2;
: end
: end
: 不知道這樣是否正確呢?
: : 你A4有必要留下來嗎?
: : 如果不用留可以寫成
: : t=randsample(first_place,1);
: : A_4([1 t])=A_4([t 1]);
: 當初會將A4.A5等代號特別留下來
: 是因為希望每一次的迴圈當中,
: 每位評審都重取一個值做為他評分鐘的第一名,
: 不要同一次迴圈當中的每位評審選出來的第一名都是相同的。
: 不知道您這種寫法是共用同一個值還會各別重取呢?
看不太懂你說的
但如果要留的話
就再寫一個變數存下來即可
首先在不同的A
t可以都存下來
for i=1:2
A(i,:)=[1 randsample(ww_x,(z_nub(n)-1))];
t(i)=randsample(first_place,1);
A(i,[1 t])=A(i,[t 1]);
end
但如果要在不同的n
t也都要存下來的話
就要先考慮在不同的n
t是否一樣長
一樣長的話就可以簡單疊成矩陣
不一樣長就要考慮用cell存
絕對不需要用到eval
: 原本的程式碼只能就單一組合去演算,所以我才希望能夠寫迴圈,
: 讓我的程式能夠得到A和B之間各個組合狀況下的東西,不用一個一個組合去演算,
: 因此原本的程式碼才沒有eval。
: 就您的回答雖然會去跑各組合狀況,但似乎不會把演算的內容留下讓我演算機率P,
: 因此我才去查到說有eval這條指令可以去給他編號在將其留下讓我能演算機率P。
: 以矩陣的方法有想過,但目前不知道該從何下手。
: 最後附上目前這個大迴圈的code
我看不太懂你的context
以下純就你的程式碼做分析
看的出來你想要用A和B去label一個變數
首先A和B是同一件事
A決定B也就被決定 (現只考慮固定i)
所以其實你只需要用B去label即可
再回頭想想先前的t的例子
你可以先想在不同A時
你要存的變數是否一樣長
一樣長就直接疊成矩陣
: ----------------------------------
: 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);']);
A_B_sum=zeros(i+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,:)']);
AB(j,:)=tmp(1,:)
: eval(['A',num2str(A),'B',num2str(B),'_sum =','A',num2str(A),'B',num2str(B),'_sum + AB_',num2str(j)]);
AB_sum(i+1,:)=AB_sum(i+1,:)+AB(j,:); % 索引從1開始
: 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,:)']);
AB(j,:)=tmp(1,:)
: eval(['A',num2str(A),'B',num2str(B),'_sum =','A',num2str(A),'B',num2str(B),'_sum + AB_',num2str(j+A)]);
AB_sum(i+1,:)=AB_sum(i+1,:)+AB(j,:);
: end
: end
: end
: end
以上是我直接翻譯eval的結果
不保證對
但希望可以提供一點思考的方向
如果你還是搞不太清楚
再考慮以下例子
case 1:
a_1=1;
a_2=4;
a_3=9;
b_1=1:5;
b_2=(1:5).^2;
b_3=(1:5).^3;
case 2
for i=1:3
eval('a_' num2str(i) '=i^2;')
eval('b_' num2str(i) '=(1:5).^i;')
end
case 3
for i=1:3
a(i)=i^2;
b(i,:)=(1:5).^i;
end
重點在於一樣長就可以疊成矩陣
作者: runkong (米塔克)   2017-05-27 13:24:00
感謝解答 目前都沒有問題了 謝謝!!

Links booklink

Contact Us: admin [ a t ] ucptt.com