让我描述一个任务:我有 3 个矩阵 (M1,M2,M3)
,它们每个都有 lenght(Mi) 行和 2 列。我们有一个函数g(x,s)
哪里s
是一个二维参数并且 x
和eta
给出。我想检查第一个矩阵 M1 是否存在诸如 g(x,M1(i,:)>eta
之类的 s我想结束算法并设置 s_new=M1(i,:)
。如果里面有这样的M1
不存在我想去矩阵M2
并在里面搜索。下一个矩阵 M3。如果这样的 s_new 不存在于所有矩阵中,我想打破。
我的第一次尝试:
function[s_new]= checking(M1,M2,M3,x)
bool1=0;
eta = 10^-8;
g = @(x,s) x-s(1)-s(2);
while bool1==0
for i=1:length(M1)
if g(x,M1(i,:))>eta
s_new=M1(i,:);
bool1=1;
end
end
for i=1:length(M2)
if g(x,M2(i,:))>eta
s_new=M2(i,:);
bool1=1;
end
end
for i=1:length(M3)
if g(x,M3(i,:))>eta
s_new=M3(i,:);
bool1=1;
end
end
bool1=1;
end
我的第二次尝试涉及一些中断选项,但它也不起作用。问题是:当 alghoritm 在 M1 中找到 s(如我们的条件成立)时,它不会停止,它会转到 M2,如果它找到这样的 s,它会更改 s_new。另外,为了节省一些时间,如果 M1 中存在这样的矩阵,我不希望算法遍历矩阵 M2。
为什么效果不佳的示例:
M1=[0,-1;0,-1], M2=[0,-2;0,-2], M3=[0,0;0,0], x=0
它应该返回向量[0,-1]
并返回[0,-2]
反而。任何帮助表示赞赏。
编辑:for 循环内的 bool1=1 用红色下划线表示,这表明 bool1 可能未使用,就好像它在 bool1=0 时没有从开始时的条件识别它一样
最佳答案
我想我发现了问题
您打算在 bool1=1;
的情况下中断 while 循环
您可以在每个部分后添加 if bool1, break;end
:
%function[s_new]= checking(M1,M2,M3,x)
M1=[0,-1;0,-1];
M2=[0,-2;0,-2];
M3=[0,0;0,0];
x=0;
bool1=0;
eta = 10^-8;
g = @(x,s) x-s(1)-s(2);
while bool1==0
for i=1:length(M1)
if g(x,M1(i,:))>eta
s_new=M1(i,:);
bool1=1;
end
end
if bool1, break;end
for i=1:length(M2)
if g(x,M2(i,:))>eta
s_new=M2(i,:);
bool1=1;
end
end
if bool1, break;end
for i=1:length(M3)
if g(x,M3(i,:))>eta
s_new=M3(i,:);
bool1=1;
end
end
bool1=1;
end
display(s_new)
没有 while 循环更优雅:
%function[s_new]= checking(M1,M2,M3,x)
M1=[0,-1;0,-1];
M2=[0,-2;0,-2];
M3=[0,0;0,0];
x=0;
bool1=0;
eta = 10^-8;
g = @(x,s) x-s(1)-s(2);
for i=1:length(M1)
if g(x,M1(i,:))>eta
s_new=M1(i,:);
bool1=1;
end
end
if ~bool1
for i=1:length(M2)
if g(x,M2(i,:))>eta
s_new=M2(i,:);
bool1=1;
end
end
end
if ~bool1
for i=1:length(M3)
if g(x,M3(i,:))>eta
s_new=M3(i,:);
bool1=1;
end
end
end
display(s_new)
关于matlab - while 循环内有 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56815939/