这是我用一小段代码作为例子的问题:
function [] = trial(test)
disp(test)
if(test == 1)
disp('test is one')
test = 0;
end
disp(test)
执行时
> trial(0)
Matlab打印出来:
0
'test is one'
0
这不是我真正的代码,它有超过500行,但这是我的代码的一部分,问题已经上升。我已经使用搜索功能来查看我是否在任何地方递增任何变量,并且在我不想要的时候已经花了2个多小时试图查看为什么MATLAB正在改变我的变量。
答案 0 :(得分:5)
不幸的是,MATLAB永远不会显示您为所显示的代码片段声明的行为,因为这个特定的片段总是会做正确的事情。你在这里做错了什么,但我们无法知道它是什么,你的代码太长了,我们无论如何都找不到错误。
我敢打赌,答案就在于其中一个常见问题:
为了解决这个问题,我强烈推荐使用调试器。跟踪您的代码,观察此变量以查看它何时发生变化。
答案 1 :(得分:4)
当我复制粘贴你的功能时,我得到以下输出
>> trial(0)
0
0
在我使用Matlab的很多年里,我发现了很多奇怪的行为和Matlab错误,但我从未见过Matlab改变变量就像那样。因此,我怀疑你的代码中确实存在错误。
为了找到问题,我建议您在出现test
的每一行设置一个停靠点,以便在查看函数时检查其值。或者,您可以定期设置条件停止(正常设置停止,然后右键单击以输入条件,例如test==1
),以便在test
采用不需要的值时该功能暂停执行。这应该可以让你快速识别坏事发生的地方。
一旦确定了有问题的代码块,就可以创建一个(相对)小的测试用例并在此处发布,以防错误变得不明显。
修改强>
@woodchips已经为您的错误提出了几种可能的原因。我的钱将用于精确度问题,即您将0.000000001
与0
进行比较。要找到这样的问题,请对涉及test
的每个if语句进行调试停止,并检查是否round(test)==test
。如果输出为false
,则只需在if语句中将test
替换为round(test)
,即可完成。
答案 2 :(得分:1)
你有没有机会写这个(注意单身等于)?
if (test = 1)
disp('test is one')
test = 0;
end
将测试设置为1,通过测试,然后将其设置回零,然后才有机会发现问题。
编辑:
要查找的其他内容可能是global
和evalin
,这两种情况都会导致远距离行动。
答案 3 :(得分:0)
再次感谢所有人,我想出了我的问题,由于错误的循环结束和没有中断,测试变量在循环期间改变了值,但问题仍然是为什么整个
0
'test is one'
0
发生了,因为它应该在循环中改变了值
1
'test is one'
1
我认为这仍然是一个谜,但它是一个固定的谜。