Почему я не могу связать логические сравнения в операторе if? - PullRequest
0 голосов
/ 20 марта 2012

Я пытаюсь выполнить блок кода, если выполняется одно из нескольких условий.Опять же, для ясности, если любое условий выполнено, я бы хотел, чтобы код выполнялся (цепочка логических ИЛИ).

Когда я набираю этот код в Matlab:

if strmatch(T,'Sd') || strmatch(T,'SuperDev') || ...
        strmatch(T,'lrnTrialVD') || strmatch(T,'lrnTrialVIS') || ...
        strmatch(T,'lrnTrialTARGET') || strmatch(T,'lrnTrialAUD')

Я получаю эту ошибку:

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

Может кто-нибудь сказать мне, где я ошибся?

/ blz

РЕДАКТИРОВАТЬ:Я использовал не ту функцию.strcmp - это то, что я хотел использовать!

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Я считаю, что это потому, что возвращаемое значение strmatch() является массивом, а не скаляром, и || не может быть определено в аргументах массива. У меня нет MATLAB передо мной (только октава), но [1, 2, 3] || [4, 5, 6, 7] работает для вас?

Кроме того, было бы лучше сопоставить регулярное выражение, такое как (Sd|SuperDev|lrnTrial(VD|VIS|TARGET|AUD)), которое немного более компактно, более читабельно и требует проверки строки 'T' только один раз (не шесть раз).

Это будет выглядеть так:

octave-3.2.4.exe:10> T1 = "Sd"
T1 = Sd
octave-3.2.4.exe:11> T2 = "Lollipop"
T2 = Lollipop
octave-3.2.4.exe:12> regexp(T1,"(Sd|SuperDev|lrnTrial(VD|VIS|TARGET|AUD))" )
ans =  1
octave-3.2.4.exe:13> regexp(T2,"(Sd|SuperDev|lrnTrial(VD|VIS|TARGET|AUD))" )
ans = [](1x0)
1 голос
/ 20 марта 2012

strmatch не обязательно возвращает что-то, что может быть преобразовано в логическое скалярное значение.Например, он может вернуть вектор местоположений совпадений, который не будет преобразован без дополнительных усилий с вашей стороны.Все это есть в сообщении об ошибке и документации по продукту, это действительно так!

...