[英]Switch/Case in Matlab to If/Else Python
我正在将一些代码从Matlab转换为Python。 目前,我正在为此:
switch SIGNATURES_TYPE
case 1
rand('seed',5);
load('USGS_1995_Library')
wavlen=datalib(:,1); % Wavelengths in microns
[L n_materiais]=size(datalib);
# select randomly
sel_mat = 4+randperm(n_materiais-4);
sel_mat = sel_mat(1:p);
M = datalib(:,sel_mat);
# print selected endmembers
clear datalib wavelen names aux st;
case 2
error('type not available')
case 3
M = rand(L,p);
case 4
M = randn(L,p);
case 5
L=p;
M = diag(linspace(1,(1/(COND_NUMBER)^(1/DECAY)),p).^DECAY);
case 6
L=p;
M = diag(linspace(1,(1/(COND_NUMBER)^(1/DECAY)),p).^DECAY);
A = randn(p);
[U,D,V] = svd(A);
M = U*M*V';
clear A U D V;
otherwise
error('wrong signatute type')
end
以前,我曾处理过类似的Switch / Case代码:
for i=1:2:(length(varargin)-1)
switch upper(varargin{i})
case 'MM_ITERS'
MMiters = varargin{i+1};
case 'SPHERIZE'
spherize = varargin{i+1};
后者我可以翻译为:
for i in range(1, 2, length(*args)-1):
if (arg[i].upper() == "MM_ITERS"):
MMiters = arg(i+1)
elif (arg[i].upper() == "SPHERIZE"):
spherize = arg(i+1)
但是对于前者,我想知道如何创建类似的if语句。 例如,对于第一种情况,我的代码可以是这样的:
if SIGNATURES_TYPE == 0:
** finish function
我想知道类似的事情是否可行,或者将语句分离为单独的函数然后调用它们会更好吗?
感谢您的帮助和输入!
if
/ else
构造将起作用。 另一种方法是使用dict
,其中键是签名类型,值是返回M
函数。 这样做的好处是不必清除任何内容。 所以看起来像这样:
def case1(p):
# calculate L and M
return L, M
def case6(p):
# calculate M
return p, M
try:
L, M = {1: case1(p),
3: (L, np.random.rand(L, p)),
4: (L, np.random.randn(L,p)),
5: (p, np.diag(np.linspace(1,(1/(COND_NUMBER)**(1/DECAY)),p)**DECAY),
6: case6(p)}[SIGNATURES_TYPE]
except KeyError:
raise ValueError('Wrong signatute type: {}'.format(SIGNATURES_TYPE))
对于您之前的示例,MATLAB代码是缺少默认参数处理的一种解决方法。 Python具有默认的参数处理功能,因此您根本不需要if
/ else
或loop。 您可以执行以下操作:
def myfunc(arg1, arg2, arg3, MM_ITERS=MM_ITERS_default, SPHERIZE=SPHERIZE_default):
其中arg1
, arg2
和arg3
是必需的参数(数量无关紧要,甚至可以为零)。 MM_ITERS_default
和SPHERIZE_default
是您希望在用户未定义它们时保留相应变量的值。 您甚至可以使用以下命令将参数直接收集到字典中:
def myfunc(arg1, arg2, arg3, **kwargs):
然后,您可以使用类似MM_ITERS
进行访问:
if MM_ITERS in kwargs:
MM_ITERS = kwargs[MM_ITERS]`
要么
MM_ITERS = kwargs.get(MM_ITERS, MM_ITERS_default)
但通常使用我前面显示的默认参数处理会更容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.