这可能是一个琐碎的问题,但是我想在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
在做什么?
答案 0 :(得分:4)
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)
答案 1 :(得分:3)
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