mathlab小程序,求助
a=;b=;
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-19 12:49 编辑
stan503 发表于 2012-5-19 01:33 static/image/common/back.gif
问题出在语句:a(cc)=[];b(dd)=[]; 我是想用过矩阵的这个元素后,就给删除掉。
第二层循环中,每次循环以后,要剔除掉随机挑选出来的那个a/b中的元素,这不是很麻烦,可以用一个线性变换来解决,即用初始a/b向量乘以一个起到筛选作用的矩阵就行了,这个矩阵有如下的分块结构:
用它左乘待变换向量就可将需要剔除的矩阵元素剔除掉:
例如,将向量(1,2,3,4)的第二个元素2剔除掉:
构建矩阵M比较麻烦,但并不是毫无规律可循,注意到每次需要剔除元素的位置为frdm_a和frdm_b,即M矩阵的k,可以这样做:
Svcmpt=zeros(1,10);
apckot=zeros(2,10);
bpckot=zeros(2,10);
for k1=1:10
A=';
B=';
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=;
%--------------------------------------------------------------------
%产生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=;
%--------------------------------------------------------------------
A=pckot1*A;
B=pckot2*B;
end
apckot(,k1)=A;
bpckot(,k1)=B;
Svcmpt(1,k1)=p;
end
apckot
bpckot
Svcmpt
每循环一个K1就得到一个p的计算值、一组a值、一组b值,最后得到10组值,a保存在apckot中,b保存在bpckot中,p保存在Svcmpt中。
是结果不对还是程序报错?
程序报错的话把错误贴出来 问题应该出在语句:a(cc)=[];b(dd)=[];
不知道楼主希望通过这个语句达到什么结果,将矩阵a和b中的值变成“空”?
如果不要这句话的话可以改正一下得到一个结果,pp矩阵应该在第一个for语句前就定义才说得过去,不然每循环一个k1,pp就重新定义一次,无法存储p的值。
这句:p=a(cc)/(a(cc)+b(dd))+p;也有问题,p的初始值为0,为什么在计算新的p值时需要加p一次呢?加与不加是相同的结果。
a=;
b=;
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
liwenhui 发表于 2012-5-17 13:56 static/image/common/back.gif
问题应该出在语句:a(cc)=[];b(dd)=[];
不知道楼主希望通过这个语句达到什么结果,将矩阵a和b中的值变成“ ...
高手!
恩恩,是啊
问题出在语句:a(cc)=[];b(dd)=[]; 我是想用过矩阵的这个元素后,就给删除掉。
也就是说每次任取取a,b的一个不同的值,四次后,a,b都只剩两个元素。 该怎么写啊? stan503 发表于 2012-5-18 21:10 static/image/common/back.gif
高手!
恩恩,是啊
问题出在语句:a(cc)=[];b(dd)=[]; 我是想用过矩阵的这个元素后,就给删除掉。 ...
不太明白你的意思,请再详细叙述一遍。从我给的语句可以得到一个10维向量,但是它不是固定的,每次基本上都不同。你的意思是,除了这个10维向量意外,你还想得到怎么样的一个a,b呢?a b是输入变量,也就是说你也想改变输入变量,并保存它们的值?但是我不明白你需要怎样去改变。 liwenhui 发表于 2012-5-18 23:15 static/image/common/back.gif
不太明白你的意思,请再详细叙述一遍。从我给的语句可以得到一个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 static/image/common/back.gif
我这个方法有点麻烦,或许还有更好的方法,希望其他朋友能提出来。
谢谢了,这个矩阵的构造还要研究研究,不过程序通过了, 是应该把a,b放在第一个for循环里面,
至于删除元素,就可以用a(cc)=[];因为是按列存储。。。
再次感谢,加好友
页:
[1]