鱼宝宝 发表于 2009-6-25 17:30

关于while循环的疑问

各位matlab的师兄师姐,我初学matlab,在编程时遇到关于while的问题,代码如下:
a=;
b=zeros(1,60); k=60; p=0; m=0;
for u=0:k-1
if a(1,u+1)~=0
   if p>5
      b(1,m+1)=a(1,u+-p); m=m+1;
   end
   p=0; u=u+1;
end
while a(1,u+1)==0
      u=u+1; p=p+1;
end
end
k=m;
运行后发现每进入while循环内p值都要多加一次,单步运行时发现while内的两个语句要连续执行两次才跳出,不知为何?也就是说假如当u=4时,a(1,u+1)满足while循环,u=5,p=1,然后应该跳出,可是却又执行一遍,但u值不变还是5,p又加1,p=2,不知为何会这样?
不知我把问题说明白了没有?谢谢各位师兄师姐指点迷津,我都困惑一整天了。

[ 本帖最后由 ChaChing 于 2009-6-25 20:23 编辑 ]

ChaChing 发表于 2009-6-25 20:18

while是个无限回圈, 直到条件不成立!
u=4时,条件a(1,u+1)==0成立, 执行u=u+1; p=p+1; 此时u=5当然得再检查a(1,u+1)==0是否成立! 不成立才跳至end
想想u=1时, 不是也得检查a(1,u+1)==0是否成立!

还有a,b都是1-D, 直接使用b(m+1),a(u+1)即可!

[ 本帖最后由 ChaChing 于 2009-6-25 20:22 编辑 ]

鱼宝宝 发表于 2009-6-26 07:27

谢谢happy的帮助,不过您好像没有明白我的意思。
我知道while是无限循环,但问题是当u=5时已不满足循环,可是while还要循环一次。
运行时出现:
u=
    5
p=
    1
u=
    5
p=
    2
为什么p要多加一次?还望happy再指点,谢谢您!

friendchj 发表于 2009-6-26 11:00

运行出错:
??? Attempted to access a(1,-89); index must be a positive integer or logical.

Error in ==> shiyan at 8
      b(1,m+1)=a(1,u+-p); m=m+1;
%%%%%%%%%%%%%%%%%%%%%
a(1,u+-p); 中的u+-p想要表达什么意思

鱼宝宝 发表于 2009-6-26 11:50

对不起,发的太匆忙了,少写了个1,重新发
a=
b=zeros(1,60); k=60; p=0; m=0;
for u=0:k-1
if a(1,u+1)~=0
   if p>5
      b(1,m+1)=a(1,u+1-p); m=m+1;
   end
   p=0; u=u+1;
end
while a(1,u+1)==0
      u=u+1; p=p+1;
end
end
k=m;

是想完成在一段数据a中找到大于5个的连零串,并将这串零的第一个零之前的值存起来即b,同时记录有多少个这样的串即m,不知大家还有什么好办法吗?

[ 本帖最后由 ChaChing 于 2009-6-26 21:30 编辑 ]

rocwoods 发表于 2009-6-26 14:13


sa = num2str(a);
sa(sa == sa(2))=[];
pos = findstr(sa,'000000');
b = a(1:pos(1)-1);

求m还要对pos处理下,楼主具体看些findstr的帮助吧。

[ 本帖最后由 rocwoods 于 2009-6-26 14:19 编辑 ]

wwbeyondww 发表于 2009-6-26 14:19

回复 7楼 rocwoods 的帖子

楼主的功能没有全实现哦,嘿嘿
还要区分后面的连0以及多于5个0

rocwoods 发表于 2009-6-26 15:36

我知道,呵呵。剩下的楼主可以自己做了。再用diff函数处理下pos,数数大于1的个数然后加1就是m。
这个方法很多上面只是容易想到的其中一种。
论坛讨论除非必要,还是不赞成全盘帮楼主包办问题解决的。

[ 本帖最后由 rocwoods 于 2009-6-26 15:42 编辑 ]

鱼宝宝 发表于 2009-6-26 17:41

首先谢谢rocwoods的帮助,很简洁明了的思路!不过还是不太适合我的程序,因为这是我的一个大程序中被我抽象简化出来的问题,实际的数组是个二维数组,一维存位置信息,一维存数据,而且数据的低两位存标识信息,我要每取一次低位做一次是否为零的判断,我只是想知道while中为什么p要多加一次?今天试着将while改为if语句,可是p还是要多加一次,所以请各位帮我看看我这段程序哪里有问题吗?为什么会出现这么诡异的事情。大家可以设断点一步步看看,真的很奇怪,我今天和同事一起研究都觉得很蹊跷,哪位知道可以帮帮我!

ChaChing 发表于 2009-6-26 22:50

先不说优化!
说真的, 楼主使用的循环logic很怪!
for loop的循环参数使用u, 里头又有u=u+1 ? 不乱才怪!

鱼宝宝 发表于 2009-6-27 10:50

happy,那我该怎么解决呢?想不出别的办法了,u要作为循环的参数,因为a数组的操作需要它作为下标,同时u还要计数,因为不管if条件是否满足,u都需要改变,我该怎么办?困在这里了……
刚刚又看了一遍程序,是否应该将程序中的两个u=u+1都去掉,让u自己随着for循环自加。

[ 本帖最后由 ChaChing 于 2009-6-27 20:51 编辑 ]

鱼宝宝 发表于 2009-6-28 11:10

还想请问一下happy,:@)
是否C语言和MATLAB语言的for循环不同,将这一段程序用C来写运行就是正确的,不会出现u,p乱加的现象。

ChaChing 发表于 2009-6-28 19:31

首先说明6F才是好方法! 楼主真的考虑参考下!
而楼主在5F的程序logic, 真的看不太懂! 若楼主坚持使用循环, 参考下
a=;
ii=1; pp=5; m=0;
while ii<=length(a)-pp+1
if a(ii)~=0, ii=ii+1;
else
    jj=1;
    while ii+jj<=length(a) && a(ii+jj)==0, jj=jj+1;end
    if jj>=pp, m=m+1; end
    ii=ii+jj;
end
end
m
最後, 说明下happy是图片的那只!

wwbeyondww 发表于 2009-6-29 07:52

回复 13楼 ChaChing 的帖子

哈哈,happy眼睛看人低

鱼宝宝 发表于 2009-6-29 18:25

:@$ :@$ chaching,我还以为是你的昵称呢。
;@P ;@P 对不起,狗狗,你叫happy,我不会再搞错了!
:@P :@P 谢谢chaching!谢谢你的建议!我上班的时候试试!
页: [1]
查看完整版本: 关于while循环的疑问