数学建模社区-数学中国

标题: mathlab小程序,求助 [打印本页]

作者: stan503    时间: 2012-5-15 21:37
标题: mathlab小程序,求助
a=[0.90        0.85        0.80        0.40        0.50        0.20];
b=[1.00        0.75        0.45        0.30        0.55        0.25];


for(kk=1:10)
p=0;
for k=1:4

aa=size(a);
c=random('unif',1,aa(2)+2-k);
cc=fix(c);
ccc(k)=cc;
d=random('unif',1,aa(2)+2-k);
dd=fix(d);
ddd(k)=dd;
p=a(cc)/(a(cc)+b(dd))+p;


a(cc)=[];b(dd)=[];

end
pp=zeros(1,10);
pp(kk)=p;
end      %想让pp保存p每次的值来着,不知道怎么老是不对。     坐等指点
作者: liwenhui    时间: 2012-5-15 21:37
本帖最后由 liwenhui 于 2012-5-19 12:49 编辑
stan503 发表于 2012-5-19 01:33
问题出在语句:a(cc)=[];b(dd)=[];  我是想用过矩阵的这个元素后,就给删除掉。


第二层循环中,每次循环以后,要剔除掉随机挑选出来的那个a/b中的元素,这不是很麻烦,可以用一个线性变换来解决,即用初始a/b向量乘以一个起到筛选作用的矩阵就行了,这个矩阵有如下的分块结构:

QQ截图20120519123343.jpg

用它左乘待变换向量就可将需要剔除的矩阵元素剔除掉:

QQ截图20120519123352.jpg

例如,将向量(1,2,3,4)的第二个元素2剔除掉:

QQ截图20120519123415.jpg



构建矩阵M比较麻烦,但并不是毫无规律可循,注意到每次需要剔除元素的位置为frdm_a和frdm_b,即M矩阵的k,可以这样做:

Svcmpt=zeros(1,10);
apckot=zeros(2,10);
bpckot=zeros(2,10);
for k1=1:10
    A=[0.90 0.85 0.80 0.40 0.50 0.20]';
    B=[1.00 0.75 0.45 0.30 0.55 0.25]';
  for k2=1:4
      lgth_a=length(A);
      lgth_b=length(B);
      
      rdm_a=random('unif',1,lgth_a+2-k2);
      frdm_a=fix(rdm_a);
      
      rdm_b=random('unif',1,lgth_b+2-k2);
      frdm_b=fix(rdm_b);
      
      p=A(frdm_a)/(A(frdm_a)+B(frdm_b));
      
      %产生a剔除矩阵--------------------------------------------------------
      E_right1=eye(frdm_a-1,frdm_a-1);
      O_middle_up1=zeros(frdm_a-1,1);
      O_left1=zeros(frdm_a-1,lgth_a-frdm_a);
      O_right1=zeros(lgth_a-frdm_a,frdm_a-1);
      O_middle_down1=zeros(lgth_a-frdm_a,1);
      E_left1=eye(lgth_a-frdm_a,lgth_a-frdm_a);
      pckot1=[E_right1,O_middle_up1, O_left1;O_right1,O_middle_down1,E_left1];
      %--------------------------------------------------------------------
      %产生b剔除矩阵--------------------------------------------------------
      E_right2=eye(frdm_b-1,frdm_b-1);
      O_middle_up2=zeros(frdm_b-1,1);
      O_left2=zeros(frdm_b-1,lgth_b-frdm_b);
      O_right2=zeros(lgth_b-frdm_b,frdm_b-1);
      O_middle_down2=zeros(lgth_b-frdm_b,1);
      E_left2=eye(lgth_b-frdm_b,lgth_b-frdm_b);
      pckot2=[E_right2,O_middle_up2, O_left2;O_right2,O_middle_down2,E_left2];
      %--------------------------------------------------------------------
      A=pckot1*A;
      B=pckot2*B;   
  end
apckot([1:2],k1)=A;
bpckot([1:2],k1)=B;
Svcmpt(1,k1)=p;
end
apckot
bpckot
Svcmpt


每循环一个K1就得到一个p的计算值、一组a值、一组b值,最后得到10组值,a保存在apckot中,b保存在bpckot中,p保存在Svcmpt中。



QQ截图20120519123415.jpg (11.6 KB, 下载次数: 646)

QQ截图20120519123415.jpg


作者: zjqylcy    时间: 2012-5-16 16:37
是结果不对还是程序报错?

程序报错的话把错误贴出来
作者: liwenhui    时间: 2012-5-17 13:56
问题应该出在语句:a(cc)=[];b(dd)=[];
不知道楼主希望通过这个语句达到什么结果,将矩阵a和b中的值变成“空”?
如果不要这句话的话可以改正一下得到一个结果,pp矩阵应该在第一个for语句前就定义才说得过去,不然每循环一个k1,pp就重新定义一次,无法存储p的值。
这句:p=a(cc)/(a(cc)+b(dd))+p;也有问题,p的初始值为0,为什么在计算新的p值时需要加p一次呢?加与不加是相同的结果。


a=[0.90 0.85 0.80 0.40 0.50 0.20];
b=[1.00 0.75 0.45 0.30 0.55 0.25];

pp=zeros(1,10);
for k1=1:10
    p=0;
  for k2=1:4
      aa=length(a);
      
      c=random('unif',1,aa+2-k2);
      cc=fix(c);
      ccc(k1,k2)=cc;
      
      d=random('unif',1,aa+2-k2);
      dd=fix(d);
      ddd(k1,k2)=dd;
      
      p=a(cc)/(a(cc)+b(dd))+p;
  end
pp(1,k1)=p;
end
pp

每次运行的结果不一样,比如运行一次得到结果:

pp =

    1.8059    2.3851    1.9156    2.0470    1.7376    2.1391    2.2067    2.4490    2.2704    2.6522


作者: stan503    时间: 2012-5-18 21:10
liwenhui 发表于 2012-5-17 13:56
问题应该出在语句:a(cc)=[];b(dd)=[];
不知道楼主希望通过这个语句达到什么结果,将矩阵a和b中的值变成“ ...

高手!
恩恩,是啊   
问题出在语句:a(cc)=[];b(dd)=[];  我是想用过矩阵的这个元素后,就给删除掉。


也就是说每次任取取a,b的一个不同的值,四次后,a,b都只剩两个元素。   该怎么写啊?
作者: liwenhui    时间: 2012-5-18 23:15
stan503 发表于 2012-5-18 21:10
高手!
恩恩,是啊   
问题出在语句:a(cc)=[];b(dd)=[];  我是想用过矩阵的这个元素后,就给删除掉。 ...

不太明白你的意思,请再详细叙述一遍。从我给的语句可以得到一个10维向量,但是它不是固定的,每次基本上都不同。你的意思是,除了这个10维向量意外,你还想得到怎么样的一个a,b呢?a b是输入变量,也就是说你也想改变输入变量,并保存它们的值?但是我不明白你需要怎样去改变。
作者: stan503    时间: 2012-5-19 01:33
liwenhui 发表于 2012-5-18 23:15
不太明白你的意思,请再详细叙述一遍。从我给的语句可以得到一个10维向量,但是它不是固定的,每次基本上 ...

问题出在语句:a(cc)=[];b(dd)=[];  我是想用过矩阵的这个元素后,就给删除掉。


也就是说每次任取取a,b的一个不同的值,四次后,a,b都只剩两个元素。   该怎么写啊?

a,b最开始有六个元素(1*6),每次随机取出a,b里的一个元素计算p,然后删除刚才取出的元素,也就是说第二次循环开始时a,b各有5个元素,以此类推.....四次后获得一个累积的p值(每次循环的p值累加),a,b则变为1*2的矩阵。       然后重复试验,得到很多个p值,用pp保存。    基本思路就是这样了,谢谢指导。
作者: liwenhui    时间: 2012-5-19 12:51
我这个方法有点麻烦,或许还有更好的方法,希望其他朋友能提出来。
作者: stan503    时间: 2012-5-19 23:25
liwenhui 发表于 2012-5-19 12:51
我这个方法有点麻烦,或许还有更好的方法,希望其他朋友能提出来。

谢谢了,这个矩阵的构造还要研究研究,不过程序通过了,   是应该把a,b放在第一个for循环里面,

至于删除元素,就可以用a(cc)=[];因为是按列存储。。。

再次感谢,加好友




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5