Matlab 中有关条件控制语句 if 和 switch 的问题
以下是一个程序,想找出四个矩阵中同一位置上最接近5的数,再把它们汇成一个新矩阵m=3;n=3;r=5;a=rand(m,n)*10;b=rand(m,n)*10;c=ra...
以下是一个程序,想找出四个矩阵中同一位置上最接近5的数,再把它们汇成一个新矩阵
m=3;
n=3;
r=5;
a=rand(m,n)*10;
b=rand(m,n)*10;
c=rand(m,n)*10;
d=rand(m,n)*10;
e=zeros(m,n);
a1=abs(a-r);
b1=abs(b-r);
c1=abs(c-r);
d1=abs(d-r);
f=min(a1,b1);
g=min(c1,d1);
h=min(f,g);
for i=1:m
for j=1:n
if h(i,j)==a1(i,j)
e(i,j)=a(i,j);
end
if h(i,j)==b1(i,j)
e(i,j)=b(i,j);
end
if h(i,j)==c1(i,j)
e(i,j)=c(i,j);
end
if h(i,j)==d1(i,j)
e(i,j)=d(i,j);
end
end
end
e
运行正常。但若将其中条件控制语句改成应有的
if h(i,j)==a1(i,j)
e(i,j)=a(i,j);
elseif h(i,j)==b1(i,j)
e(i,j)=b(i,j);
elseif h(i,j)==c1(i,j)
e(i,j)=c(i,j);
else h(i,j)==d1(i,j)
e(i,j)=d(i,j);
end
运行结果为:
ans =
1
ans =
1
e =
9.0441 6.3195 5.5531
4.9388 4.0628 8.4968
4.8849 5.7141 3.7972
计算结果倒也正常,却莫名其妙地多出了几个(数量不确定,有时多有时少)“ans = 1”,请高手解释那是怎么多出来的,如何避免?另外,也想把控制语句由if改成switch,但不会改,也只好劳驾高手了(我自己乱编的结果既不能算出该有的数据,也避免不了上述多出ans = 1的问题)! 展开
m=3;
n=3;
r=5;
a=rand(m,n)*10;
b=rand(m,n)*10;
c=rand(m,n)*10;
d=rand(m,n)*10;
e=zeros(m,n);
a1=abs(a-r);
b1=abs(b-r);
c1=abs(c-r);
d1=abs(d-r);
f=min(a1,b1);
g=min(c1,d1);
h=min(f,g);
for i=1:m
for j=1:n
if h(i,j)==a1(i,j)
e(i,j)=a(i,j);
end
if h(i,j)==b1(i,j)
e(i,j)=b(i,j);
end
if h(i,j)==c1(i,j)
e(i,j)=c(i,j);
end
if h(i,j)==d1(i,j)
e(i,j)=d(i,j);
end
end
end
e
运行正常。但若将其中条件控制语句改成应有的
if h(i,j)==a1(i,j)
e(i,j)=a(i,j);
elseif h(i,j)==b1(i,j)
e(i,j)=b(i,j);
elseif h(i,j)==c1(i,j)
e(i,j)=c(i,j);
else h(i,j)==d1(i,j)
e(i,j)=d(i,j);
end
运行结果为:
ans =
1
ans =
1
e =
9.0441 6.3195 5.5531
4.9388 4.0628 8.4968
4.8849 5.7141 3.7972
计算结果倒也正常,却莫名其妙地多出了几个(数量不确定,有时多有时少)“ans = 1”,请高手解释那是怎么多出来的,如何避免?另外,也想把控制语句由if改成switch,但不会改,也只好劳驾高手了(我自己乱编的结果既不能算出该有的数据,也避免不了上述多出ans = 1的问题)! 展开
展开全部
if h(i,j)==a1(i,j)
e(i,j)=a(i,j);
elseif h(i,j)==b1(i,j)
e(i,j)=b(i,j);
elseif h(i,j)==c1(i,j)
e(i,j)=c(i,j);
else h(i,j)==d1(i,j)
e(i,j)=d(i,j);
end
对这一段程序仔细分析,我没有仔细分析前面的程序,但可以猜测以下,h(i,j)肯定会和a1(i,j)、b1(i,j)、c1(i,j)、d1(i,j)中的某一个相等,这样当h(i,j)和a1(i,j)、b1(i,j)、c1(i,j)不相等的时候,就会执行到最后一条else语句
else h(i,j)==d1(i,j)
e(i,j)=d(i,j);
这时候ans=1;就会出现了。
也就是Matlab把h(i,j)==d1(i,j)当做是一条单独的语句,而不是判断条件。
究其原因,就是,if-elseif-else-end最后一个else是不用判断条件的,前面的条件都不满足就会执行else后的语句。
再加上,用来计算的矩阵是由rand随机生成的,这样,就可以很好的解释为什么有时多,有时少,数量不确定的现象了。
所以修改的办法是:1,把h(i,j)==d1(i,j)删除;2,把else改成elseif。
对于这个程序,我感觉用if语句还是比较合理的,用switch-case可以用,但是它不适合这样的分支条件。
e(i,j)=a(i,j);
elseif h(i,j)==b1(i,j)
e(i,j)=b(i,j);
elseif h(i,j)==c1(i,j)
e(i,j)=c(i,j);
else h(i,j)==d1(i,j)
e(i,j)=d(i,j);
end
对这一段程序仔细分析,我没有仔细分析前面的程序,但可以猜测以下,h(i,j)肯定会和a1(i,j)、b1(i,j)、c1(i,j)、d1(i,j)中的某一个相等,这样当h(i,j)和a1(i,j)、b1(i,j)、c1(i,j)不相等的时候,就会执行到最后一条else语句
else h(i,j)==d1(i,j)
e(i,j)=d(i,j);
这时候ans=1;就会出现了。
也就是Matlab把h(i,j)==d1(i,j)当做是一条单独的语句,而不是判断条件。
究其原因,就是,if-elseif-else-end最后一个else是不用判断条件的,前面的条件都不满足就会执行else后的语句。
再加上,用来计算的矩阵是由rand随机生成的,这样,就可以很好的解释为什么有时多,有时少,数量不确定的现象了。
所以修改的办法是:1,把h(i,j)==d1(i,j)删除;2,把else改成elseif。
对于这个程序,我感觉用if语句还是比较合理的,用switch-case可以用,但是它不适合这样的分支条件。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询