MATLAB меняет переменные, когда я не хочу - PullRequest
0 голосов
/ 27 апреля 2010

Вот моя проблема в небольшом фрагменте кода, который используется в качестве примера:

function [] = trial(test)

disp(test)

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

Когда я выполню

> trial(0)

Матлаб распечатывает это:

0
'test is one'
0

Это не мой настоящий код, его более 500 строк, но это часть моего кода, где возникла проблема. Я использовал функцию поиска, чтобы узнать, увеличивал ли я где-нибудь какие-либо переменные, и потратил более 2 часов, пытаясь понять, почему MATLAB меняет мои переменные, когда я этого не хочу.

Ответы [ 4 ]

5 голосов
/ 27 апреля 2010

К сожалению, MATLAB никогда не будет отображать поведение, которое вы заявляете для фрагмента кода, который вы показываете, так как этот конкретный фрагмент ВСЕГДА будет делать правильно. Вы делаете что-то не так, но мы не можем знать, что это такое, и ваш код слишком длинный, чтобы мы все равно могли найти ошибку.

Могу поспорить, что ответ лежит в одной из следующих распространенных проблем:

  1. Проблема с глобальными переменными.
  2. Конфликт пространства имен, когда вы назвали переменную с тем же именем, что и у функции.
  3. Задача класса, в которой проводится тест, сравнивающий переменные разных классов, возможно, uint8 и double.
  4. Проблема точности, когда проверка на точное равенство выполняется с числами с плавающей запятой.

Чтобы решить эту проблему, я настоятельно рекомендую отладчик. Отслеживайте свой код, просматривая эту переменную, чтобы увидеть, когда она изменится.

4 голосов
/ 27 апреля 2010

Когда я копирую и вставляю вашу функцию, я получаю следующий вывод

>> trial(0)
 0

 0

За многие годы использования Matlab я обнаружил довольно много странных поведений и ошибок в Matlab, но я никогда не видел, чтобы Matlab изменял переменную просто так. Таким образом, я подозреваю, что в вашем коде действительно есть ошибка.

Чтобы найти проблему, я предлагаю установить остановку в каждой строке, где появляется test, чтобы вы могли проверять ее значение при прохождении через функцию. Кроме того, вы можете периодически устанавливать условные остановки (обычно устанавливайте остановку, затем щелкните правой кнопкой мыши, чтобы ввести условие, например test==1), чтобы функция прекращала выполнение, когда test приняла нежелательное значение. Это должно позволить вам быстро определить место, где происходят плохие вещи.

Как только вы определили проблемный кодовый блок, вы можете создать (относительно) небольшой тестовый пример и опубликовать его здесь, если ошибка не стала очевидной.

EDIT

@ woodchips предложил несколько возможных причин вашей ошибки. Мои деньги были бы на задаче точности, т. Е. Если бы вы сравнили 0.000000001 с 0. Чтобы найти такую ​​проблему, поместите отладочную остановку в каждый оператор if, который включает test, и проверьте, round(test)==test. Если вывод false, вы просто замените test на round(test) в своем операторе if, и все готово.

1 голос
/ 27 апреля 2010

Есть ли шанс, что вы на самом деле написали это (обратите внимание на одинаковые)?

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

Это устанавливает тест на 1, проходит тест, а затем устанавливает его обратно на ноль, прежде чем у вас появится реальная возможность заметить проблему.

EDIT:

Другие вещи, которые нужно искать, это global и evalin, которые оба вызывают действие на расстоянии.

0 голосов
/ 28 апреля 2010

Опять же, спасибо всем, я разобрался в своей проблеме, из-за неуместных концов циклов и отсутствия разрывов, тестовая переменная меняла значения во время цикла, однако остается вопрос, почему все

0
'test is one'
0

произошло, так как значение было изменено в цикле, оно должно было быть

1
'test is one'
1

Полагаю, все еще остается загадкой, однако это загадка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...