我有一堆嵌套'如果'彼此之间的陈述,我无法让它们以我想要的方式流动。我有一个if语句,如果符合,我运行一个唯一性测试(myuniquetest),如果这表明我的条件给出了一个独特的结果,我想记录它并继续。我已经弄清楚了这一部分但是,如果第一个条件没有给出唯一的结果,我想继续使用elseif语句的其余部分来查看后续的那些是否给出了唯一的结果。 (我在这段代码中总共有8个elseif语句,但我想这个方法我会是一样的。)我的代码看起来像这样:
if edgedouble(y0-1, x0) == 1 && (y0-1)>=y1 && (y0-1)<=y2;
testpt = [y0-1, x0];
uni = myuniquetest(testpt, mypoints);
if uni ==1;
k = k+1;
mypoints{1,k} = testpt;
mypoints = testmypoints(mypoints, edgedouble, x1, x2, y1, y2);
end
elseif edgedouble(y0-1, x0+1) ==1 && (y0-1)>=y1 && (y0-1)<=y2 && ...
(x0+1)>=x1 && (x0+1)<=x2;
testpt = [y0-1, x0+1];
uni = myuniquetest(testpt, mypoints);
if uni ==1;
k = k+1;
mypoints{1,k} = testpt;
mypoints = testmypoints(mypoints, edgedouble, x1, x2, y1, y2);
end
etc....
end
我想要它做的是,如果uni == 0,继续执行elseif(condition2)(等等),但目前它只是停止。我尝试在每个嵌入式&#39; if&#39;之后添加while语句。陈述所以他们看起来像这样:
if uni ==1;
(log my values, move on)
end
while uni==0
continue
end
然而,它崩溃了我的其余代码,随后是Matlab。有更简单的方法吗?
唯一性函数的代码如下:
function[uni] = myuniquetest(testpoint, mypoints)
mysize = size(mypoints);
for w = 1:mysize(2);
myt = isequal(testpoint, mypoints{1,w});
if myt == 1;
uni = 0;
break
else
uni = 1;
end
end
当条件得到满足并且是唯一的时,所有这些都有效,但它不起作用,只有在满足条件但没有唯一性时才会停止。
谢谢!
答案 0 :(得分:3)
我建议您将所有布尔条件作为单个元素放入logical
数组,以及另一个数组中的所有可能测试点。之后,迭代在您的所有条件下使用相应的测试点,并使用testmypoints
脚本检查uni = 1
或uni = 0
。我们基本上会继续迭代您的所有条件和相应的测试点直到 uni = 1
,然后我们就可以突破循环。
因此,创建一个名为logical
的{{1}}数组,它可以执行以下操作:
conditions
将要检查的每个条件放在conditions = [edgedouble(y0-1, x0) == 1 && (y0-1)>=y1 && (y0-1)<=y2;
edgedouble(y0-1, x0+1) ==1 && (y0-1)>=y1 && (y0-1)<=y2 && (x0+1)>=x1 && (x0+1)<=x2;
...
...];
数组中。接下来,将每个条件的相应测试点放在另一个数组中。我们称之为logical
:
testpoints
testpoints = [y0-1 x0;
y0-1 x0-1;
...
...];
将是一个2D数组,其中每一行都包含一个测试点,该测试点匹配testpoints
中相应位置的条件。现在,您所要做的就是遍历每个条件和相应的点,直到我们点击conditions
。如果uni = 1
,则继续循环并检查其他条件,直到uni = 0
,或者如果我们用完条件检查,那么此循环将结束,您将不会记录任何结果。
没有进一步的麻烦:
uni = 1
让我们慢慢浏览一下这段代码,首先,我们检查特定条件是否为for idx = 1 : numel(conditions)
if conditions(idx)
testpt = testpoints(idx,:);
uni = myuniquetest(testpt, mypoints);
if uni == 1
k = k + 1;
mypoints{1,k} = testpt;
mypoints = testmypoints(mypoints, edgedouble, x1, x2, y1, y2);
break;
end
end
end
。如果是,那么让我们获得与该位置对应的相应测试点,然后检查true
。应该myuniquetest
,然后我们将运行uni == 1
时发生的代码(说实话,我不明白你在这里做什么,但如果你说它有效......那么好吧! )。一旦发生这种情况,我们就会突破循环并记录您的结果。如果uni == 1
,那么我们的条件不满意,所以我们应该继续检查其他条件。
希望这有帮助!