2015-04-26 3 views
0

Вот мой код:&& операторы вопрос в MATLAB

friendly_output = num2str(std(counts_channel),'%.4f'); 
if friendly_output > 0 && friendly_output <= 1000 
    variable = 100 
elseif friendly_output > 1000 && friendly_output <= 1500 
    variable = 500 

Переменная friendly_output здесь десятичное число. Тем не менее, в то время как я выполнения этого кода, это подсказывает мне ошибку:

Operands to the || and && operators must be convertible to logical scalar values

Я попытался решить эту проблему путем замены && с &, программа работает, но переменная friendly_output не удалось поймать правильный if заявление.

Я попытался вывести значение friendly_output, значение верное, но утверждение, в которое оно идет, неверно.

спасибо.

+2

Непонятно, почему вы используете 'num2str' в первую очередь. Если вы распечатаете переменную 'friendly_output' и' size (friendly_output) ', вы увидите, что это не скаляр. Теперь попробуйте «help &» и «help &&» в окне команд. Также см. [Этот ответ] (http://stackoverflow.com/a/1379497/2278029). – horchler

+0

Удалите num2str или используйте str2num на friendly_output. Если вы хотите сравнить строки, используйте strcmp. – Arturo

ответ

4

Если мое предположение верно, то ваш friendly_output имеет тип char

Чтобы проверить это, попробуйте следующее:

class(friendly_output) 

Если вам нужно сравнить его с целым числом, вам нужно преобразовать его обратно к числу.

Для этого добавьте этот код после первой строки

friendly_output = str2double(friendly_output); 
%// changed from `eval` to `str2double` as suggested by @horchler 
%// Using `str2double` over `eval` or `str2num` is a best practice. 
%// or you could just avoid `num2str` conversion 

PS:

Оператор && не работает для вас, потому что они хорошо работают только на скалярные входов. Но поскольку переменная friendly_output представляет собой массив char, вы получили ошибку.

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

Для получения дополнительной информации о разнице между & и &&

Вот пример того, что происходит, когда вы не преобразовать строку обратно в номер:

>> a = '1200.5' 

a = 

1200.5 

>> a > 1000 

ans = 

0  0  0  0  0  0 

ASCII- значения char 0-9 колеблется от 49-57, в то время как значение ASCII char '.' is 46

Although, 1200.5 is greater than 1000, it actually calculate this way

50(char '1') is not greater than 1000.
51(char '2') is not greater than 1000.
49(char '0') is not greater than 1000.
49(char '0') is not greater than 1000.
46(char '.') is not greater than 1000.
54(char '5') is not greater than 1000.

+1

В Matlab нет «струнного» класса. 'friendly_output' - массив' char'. И 'eval' - это неправильная (небезопасная и плохая практика) способ преобразования строки, представляющей значение с плавающей точкой, в двойную точность. Для этого нужно использовать 'str2double' или' str2num'.Вы не объяснили причину ошибки и почему '&&' не работает для нескалярных массивов 'char'. Я также не знаю, что OP пытается выполнить с помощью 'num2str', в первую очередь. – horchler

+0

@horchler, Спасибо, что указал на ошибки вместо того, чтобы просто проголосовать. Я отредактировал ответ. Если вы все еще считаете, что мне не хватает информации, не стесняйтесь делать свой собственный ответ, и я буду его продвигать. Также вы могли бы объяснить, почему использование 'eval' является плохой практикой? –

+1

Основная причина не использовать 'eval' заключается в том, что в большинстве случаев есть лучшие, быстрые и надежные способы сделать то же самое (это одно). 'eval' оценивает произвольную строку, не проверяя ничего об этом, что, очевидно, может привести к множеству проблем или уязвимостей. Подробнее здесь: [1] (http://blogs.mathworks.com/videos/2010/03/08/top-10-matlab-code-practices-that-make-me-cry/), [2] (http : //blogs.mathworks.com/loren/2005/12/28/evading-eval/) и [3] (http://www.mathworks.com/matlabcentral/answers/51946-systematic-do-not- использовать-глобальный-дон-т-потребительной Eval). – horchler

Смежные вопросы