scott198510 发表于 2011-6-20 21:03:12

randsample的随机抽取问题

本帖最后由 scott198510 于 2011-6-21 10:02 编辑

问问路过的大虾;
Fa=; %四个状态值
In = find(Fa>=1)      %找出四个状态值里面为1的位置
index=randsample(In,1,'true') %如果找出的坐标位置不唯一就随机的取一个

上面这个抽取很诡异;当Fa如上所述 Fa=;就是说非0个数只有1个
执行 In = find(Fa>=1)    ;    得到In里面元素只有1个,按照道理这时候得到的index 是在In 里面随机抽取的,应该是和index一样,可是得到的结果不一样;
可是当Fa=; 时候,就是说非0元素个数大于1的时候,得到的In 元素是两个,这时候在In 里面随机抽取得到的才是正确的;

可是将上面的语句改成这样的逻辑结构:
F a=; %四个邻居结晶状态值
In = find(Fa>=1)         %找出四个
index=randsample(In,1,'true').*(length(In)>1)+In.*(length(In)<=1)

现在问题又出现了,现在是Fa 里面非0 个数为1的时候结构正确,非0个数大于1却错误了;
但是将上面的逻辑语句改成循环的时候,却没有问题了:

Fa=; %四个邻居结晶状态值;非0 只有2个
%%或者 Fa=; %四个状态值 非0 有1个
In = find(Fa>=1)         %找出四个状态
if length(In)>1
         index=randsample(In,1,'true') ;
else   index=In ;
end

用上面的循环可以达到我的要求,但是循环在主程序里面速度很慢,
问题是出现前面的几种情况的原因在哪里呢?
哪位大侠解释一下





xiezhh 发表于 2011-6-21 10:17:00

当length(In)>1时,In.*(length(In)<=1)的结果是一个零向量而不是零。

scott198510 发表于 2011-6-21 10:24:22

本帖最后由 scott198510 于 2011-6-21 10:25 编辑

2# xiezhh

Fa=; %四个状态值
In = find(Fa>=1)         %找出四个
index=randsample(In,1,'true').*(length(In)>1)+sum(In.*(length(In)<=1))

或者:
index=randsample(In,1,'true')*(length(In)>1)+In(1)*(length(In)<=1)


或者:index=randsrc(1,1,In)


多谢谢老师和 leopold兄台 ,问题解决了
页: [1]
查看完整版本: randsample的随机抽取问题