在Matlab中的if-else语句中编写字符串变量

时间:2019-07-08 11:23:18

标签: matlab for-loop boolean

这可能是一个琐碎的问题,但是我想在Matlab中编写一个简单的for循环,该循环在不同情况下使用字符串变量。

在Python中,很简单,

ResultSet.getMetaData().getColumnTypeName()

在Matlab中我尝试过

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)

,但不计算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在做什么?

2 个答案:

答案 0 :(得分:4)

strcmpiif / 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)

答案 1 :(得分:3)

MATLAB> = R2016b中的另一个选项是对文本数据使用string而不是charstring可让您使用==进行比较,如下所示:

dist = "markovian"

x = pi/7

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