Запись строковых переменных в операторах if-else в Matlab - PullRequest
1 голос
/ 08 июля 2019

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

В Python это просто,

from numpy import cos, sin, pi

dist = 'markovian'

x = pi/7

if dist == 'lorentzian':
    z = sin(x)
    print(z)
elif dist == 'markovian':
    z = cos(x)
    print(z)
else:
    z = sin(x) + cos(x)
    print(z)

тогда как в Matlab я пробовал

dist = 'markovian';

x = pi/7;

if dist == strcmpi('lorentzian','true')
    z = sin(x)
elseif dist == strcmpi('markovian','true')
    z = cos(x)
else
    z = sin(x) + cos(x)
end

, но не рассчитывается z. Что я делаю не так с strcmpi?

Ответы [ 2 ]

4 голосов
/ 08 июля 2019

Использование strcmpi с if / else

Функция strcmpi сравнивает две строки без учета регистра и возвращает логическое значение.Таким образом, вам нужно использовать его следующим образом:

dist = 'markovian';
x = pi/7;
if strcmpi(dist, 'lorentzian')
    z = sin(x)
elseif strcmpi(dist, 'markovian')
    z = cos(x)
else
    z = sin(x) + cos(x)
end

Использование switch

Код может быть более понятным с помощью оператора switch.Вы можете использовать lower для достижения нечувствительности к регистру.

dist = 'markovian';
x = pi/7;
switch lower(dist)
    case 'lorentzian'
        z = sin(x)
    case 'markovian'
        z = cos(x)
    otherwise
        z = sin(x) + cos(x)
end

Без ветвления

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

Это работает путем нахождения индекса выбранной опции в ячейке.массив векторов char, если имеется;и используя feval для оценки соответствующей функции из массива ячеек дескрипторов функций:

names = {'lorentzian', 'markovian'}; % names: cell array of char vectors
funs = {@(x)sin(x), @(x)cos(x), @(x)sin(x)+cos(x)}; % functions: cell array of handles.
                                                    % Note there is one more than names
dist = 'markovian';
x = pi/7;
[~, ind] = ismember(lower(dist), names); % index of dist in names
ind = ind + (ind==0)*numel(funs); % if 0 (dist not in names), select last function
feval(funs{ind}, x)
3 голосов
/ 08 июля 2019

Другой вариант в MATLAB> = R2016b - использовать string вместо char для текстовых данных.string позволяет сравнивать, используя ==, например:

dist = "markovian"

x = pi/7

if dist == "lorentzian"
    z = sin(x)
elseif dist == "markovian"
    z = cos(x)
else
    z = sin(x) + cos(x)
end
...