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