我正在将一些代码从 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
或循环。你可以这样做:
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)
但一般来说,使用我之前展示的默认参数处理会更容易。
关于python - Matlab 中的 Switch/Case 到 Python 中的 If/Else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51546354/