继续‘;对于’;Matlab中现有变量的循环

继续‘;对于’;Matlab中现有变量的循环,matlab,debugging,for-loop,Matlab,Debugging,For Loop,我有一个Matlab脚本,包括一个for循环,如下所示: for k = 1:10 c = myfun(k,a,b); result{k} = c; end 现在的问题是,在for循环期间,有时myfun()可能会出错并停止。在修复了myfun()中的错误后,如何使用现有的变量值继续运行?原因是myfun()需要很长时间才能得到结果,而且之前的结果是正确的 例如,如果在k==4时发生错误,那么我将保存当前工作区中的所有变量。我在c=myfun(k,a,b)处设置了一个断点并恢复

我有一个Matlab脚本,包括一个
for
循环,如下所示:

for k = 1:10
    c = myfun(k,a,b);
    result{k} = c;
end
现在的问题是,在
for
循环期间,有时
myfun()
可能会出错并停止。在修复了
myfun()
中的错误后,如何使用现有的变量值继续运行?原因是
myfun()
需要很长时间才能得到结果,而且之前的结果是正确的

例如,如果在
k==4
时发生错误,那么我将保存当前工作区中的所有变量。我在
c=myfun(k,a,b)处设置了一个断点
并恢复保存的变量,但我发现在下一个循环中,
k
将是
2
,而不是我想要的
5
。我认为,在for循环期间,不允许Matlab修改k的值。我已经测试过几次了


如何使用一些现有数据继续
for
循环?

解决方案可以首先捕获以下异常并从中传递:

bug = [];
for k = 1:10
    try
        c = myfun(k,a,b);
        result{k} = c;
    catch
        warning('some bug for the following values:');
        display([k a b]);
        bug = [bug; k a b];
        result{k} = NaN;
    end
end

然后迭代
bug
,在调试后计算缺少的信息。当您的算法不依赖于结果的上一个值(或不是递归的)时,此解决方案有效。

在解决方案上可以首先捕获以下异常并从中传递:

bug = [];
for k = 1:10
    try
        c = myfun(k,a,b);
        result{k} = c;
    catch
        warning('some bug for the following values:');
        display([k a b]);
        bug = [bug; k a b];
        result{k} = NaN;
    end
end

然后迭代
bug
,在调试后计算缺少的信息。当您的算法不依赖于结果的上一个值(或不是递归的)时,此解决方案有效。

您不能在循环内部以编程方式更改
for
循环迭代器

例如:

for ii = 1:3
    disp(ii)
    ii = 3;
end
% Load data here
for ii = 3:3
    disp(ii)
end
印刷品:

 1

 2

 3
如果您要根据收到的错误修改代码,这将是没有好处的,因为它不会反映代码中的更改,直到调试器退出并再次执行代码(除非您在调试器中手动执行)。如果您不修改代码,您可能会使用一个子句来捕获可修复的问题

如果正在为以后的索引加载数据,然后重新启动,则可以更改
for
循环的开始位置,或者在
期间使用
循环(如果合适)

例如:

for ii = 1:3
    disp(ii)
    ii = 3;
end
% Load data here
for ii = 3:3
    disp(ii)
end
打印
3

其中,
while
解释为:

% Load data here
ii = 3
while ii <= 3
    disp(ii)
    ii = ii + 1;
end
%在此处加载数据
ii=3

而ii则不能在循环内部以编程方式更改
for
循环迭代器

例如:

for ii = 1:3
    disp(ii)
    ii = 3;
end
% Load data here
for ii = 3:3
    disp(ii)
end
印刷品:

 1

 2

 3
如果您要根据收到的错误修改代码,这将是没有好处的,因为它不会反映代码中的更改,直到调试器退出并再次执行代码(除非您在调试器中手动执行)。如果您不修改代码,您可能会使用一个子句来捕获可修复的问题

如果正在为以后的索引加载数据,然后重新启动,则可以更改
for
循环的开始位置,或者在
期间使用
循环(如果合适)

例如:

for ii = 1:3
    disp(ii)
    ii = 3;
end
% Load data here
for ii = 3:3
    disp(ii)
end
打印
3

其中,
while
解释为:

% Load data here
ii = 3
while ii <= 3
    disp(ii)
    ii = ii + 1;
end
%在此处加载数据
ii=3

while ii可能使用已经计算的数据初始化数据集,然后在下一个迭代开始循环。可能使用已经计算的数据初始化数据集,然后在下一个迭代开始循环。对于
while
循环,仍然不允许更改循环变量
ii
?我没有检查。您可以在
while
循环中更改循环变量。谢谢,我现在明白了。对于
while
循环,仍然不允许更改循环变量
ii
?我没有检查。您可以在
循环中更改循环变量,而
循环。谢谢,我现在明白了。