找回密码
 注册
Simdroid-非首页
查看: 104|回复: 2

randsample的随机抽取问题

[复制链接]
发表于 2011-6-20 21:03:12 | 显示全部楼层 |阅读模式 来自 江苏南京
本帖最后由 scott198510 于 2011-6-21 10:02 编辑

问问路过的大虾;
  Fa=[0,1,0,0]; %四个状态值
  In = find(Fa>=1)        %找出四个状态值里面为1的位置

index=randsample(In,1,'true') %如果找出的坐标位置不唯一就随机的取一个

上面这个抽取很诡异;当Fa如上所述 Fa=[0,1,0,0];  就是说非0个数只有1个

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

可是将上面的语句改成这样的逻辑结构:
F a=[0,1,1,0]; %四个邻居结晶状态值
  In = find(Fa>=1)           %找出四个

index=randsample(In,1,'true').*(length(In)>1)+In.*(length(In)<=1)

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

Fa=[0,1,1,0]; %四个邻居结晶状态值;非0 只有2个
%%或者 Fa=[0,0,1,0]; %四个状态值 非0 有1个
In = find(Fa>=1)           %找出四个状态

if length(In)>1
         index=randsample(In,1,'true') ;

else   index=In ;
end

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





发表于 2011-6-21 10:17:00 | 显示全部楼层 来自 天津
Simdroid开发平台
当length(In)>1时,In.*(length(In)<=1)的结果是一个零向量而不是零。
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-21 10:24:22 | 显示全部楼层 来自 江苏南京
本帖最后由 scott198510 于 2011-6-21 10:25 编辑

2# xiezhh

Fa=[0,0,1,0]; %四个状态值
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兄台 ,问题解决了
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-6 11:25 , Processed in 0.034636 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表