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