python - Matlab 中的 Switch/Case 到 Python 中的 If/Else

标签 python matlab if-statement switch-statement

我正在将一些代码从 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):

其中 arg1arg2arg3 是必需的参数(数字并不重要,甚至可以为零)。 MM_ITERS_defaultSPHERIZE_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/

相关文章:

python - 如何返回与重复模式匹配的整个非拉丁字符串,例如 AAB 或 ABB

matlab - 如何在 Simulink 中调整子系统模块上 IO 端口的显示?

matlab - 特定元组的生成和计数(matlab)

python - MATLAB 比 Python 快吗?

java - 循环和统计。未打印正确的值

html - 为什么我一直收到无法加载资源 : Error everytime I run my application?

python - Django manage.py runserver 抛出 ImportError : AdminMediaHandler

python - map (lambda x : int(x, 16)/256.0,[颜色[1 :3],颜色[3 :5],颜色[5:7]])

python - 如何使用liblas获取las point的 'data'字段中存储的内容?

php - if 语句在 echo?