当我不想要它时,MATLAB正在改变变量

时间:2010-04-27 02:14:46

标签: matlab

这是我用一小段代码作为例子的问题:

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正在改变我的变量。

4 个答案:

答案 0 :(得分:5)

不幸的是,MATLAB永远不会显示您为所显示的代码片段声明的行为,因为这个特定的片段总是会做正确的事情。你在这里做错了什么,但我们无法知道它是什么,你的代码太长了,我们无论如何都找不到错误。

我敢打赌,答案就在于其中一个常见问题:

  1. 全局变量的问题。
  2. 命名空间冲突,您将变量命名为与函数同名。
  3. 一个类问题,在这里测试比较不同类的变量,可能是uint8和double。
  4. 精度问题,其中使用浮点数进行精确相等的测试。
  5. 为了解决这个问题,我强烈推荐使用调试器。跟踪您的代码,观察此变量以查看它何时发生变化。

答案 1 :(得分:4)

当我复制粘贴你的功能时,我得到以下输出

>> trial(0)
 0

 0

在我使用Matlab的很多年里,我发现了很多奇怪的行为和Matlab错误,但我从未见过Matlab改变变量就像那样。因此,我怀疑你的代码中确实存在错误。

为了找到问题,我建议您在出现test的每一行设置一个停靠点,以便在查看函数时检查其值。或者,您可以定期设置条件停止(正常设置停止,然后右键单击以输入条件,例如test==1),以便在test采用不需要的值时该功能暂停执行。这应该可以让你快速识别坏事发生的地方。

一旦确定了有问题的代码块,就可以创建一个(相对)小的测试用例并在此处发布,以防错误变得不明显。

修改

@woodchips已经为您的错误提出了几种可能的原因。我的钱将用于精确度问题,即您将0.0000000010进行比较。要找到这样的问题,请对涉及test的每个if语句进行调试停止,并检查是否round(test)==test。如果输出为false,则只需在if语句中将test替换为round(test),即可完成。

答案 2 :(得分:1)

你有没有机会写这个(注意单身等于)?

if (test = 1)
  disp('test is one')
  test = 0;
end

将测试设置为1,通过测试,然后将其设置回零,然后才有机会发现问题。

编辑:

要查找的其他内容可能是globalevalin,这两种情况都会导致远距离行动。

答案 3 :(得分:0)

再次感谢所有人,我想出了我的问题,由于错误的循环结束和没有中断,测试变量在循环期间改变了值,但问题仍然是为什么整个

0
'test is one'
0

发生了,因为它应该在循环中改变了值

1
'test is one'
1

我认为这仍然是一个谜,但它是一个固定的谜。