【问题标题】:MATLAB equivalent to Python's negative indexingMATLAB 相当于 Python 的负索引
【发布时间】:2016-02-07 04:52:09
【问题描述】:

问题:根据smth 的布尔值,数组a 必须向前或向后迭代。由于递归,必须事先处理第一个(或最后一个)元素。

在 Python 中,我可以通过稍微调整索引 (*) 来影响数组的迭代方向:

a=range(2,11,2)

sign=1
os=0

if smth:                
    sign=-1
    os=1

print(a[sign*os])          #*
for k in range(5):
    print(a[sign*(k+os)])  #*

现在,由于 MATLAB 中没有负索引,我找不到将指令加倍(简化为上面的“打印”)和调整索引的方法:

a=2:2:10

if smth
    a(1)
    for i=2:5
        a(i)
    end   
else
    a(end)
    for i=4:-1:1
        a(i)
    end
end

有没有办法解决这个问题,最终类似于上面的 Python 代码?实际的指令会更长,包括多维索引的组合。

此外,在这种情况下,在评估 smth 之后翻转数组是不可能的。

【问题讨论】:

    标签: python arrays matlab indexing


    【解决方案1】:

    我认为您正在寻找的是关键字end。当出现在索引表达式中时,它指的是数组中的最后一个位置。您还应该记住,在 MATLAB 中,可以为循环索引指定一个预制向量,因此不必使用冒号 (:) 运算符“即时”创建它。以下是如何根据您的需要使用它的示例:

    ind_vec = 1:5;
    
    if smth
      ind_vec = ind_vec(2:end);
    else
      ind_vec = ind_vec(end-1:-1:1);
    end
    
    for ii = ind_vec
      ... %// do something
    end
    

    或者,您可以将临时三元运算符1 与flip 结合使用以获得正确的索引:

    function out = iftr(cond,in1,in2)
    
    if cond
        out = in1;
    else
        out = in2;
    end
    

    然后您可以使用以下方法获得所需的结果:

    ind_vec = 1:5;
    ind_vec = iftr(smth,ind_vec,flip(ind_vec));
    ind_vec = ind_vec(2:end);
    

    1 - 也可用作function handle。

    【讨论】:

    • 我想要克服的事情是必须写整个 ...do something... 两次。这——如果嵌套得当的话——可能会解决这个问题。与此同时,我发现了一种非常人性化的方法(尽管适用于任何类型的索引),你怎么看?
    • @Maasumi - 你能过来MATLAB chat吗?
    【解决方案2】:

    这不是很好,但这可能会奏效,

    for i=smth*(1:5)+~smth*(5:-1:1)
        a(i)
    end
    

    【讨论】:

    • 虽然仅供参考,但我很确定如果数组(1:5 和 5:-1:1)大小不同,这将失败。
    【解决方案3】:

    怎么样(你可以用a的实际长度替换5):

    if smth
        it = 1:5
    else
        it = 5:-1:1
    end
    
    for i=it
        a(i)
    end
    

    【讨论】:

    • 我忘了说明这在实际代码中不起作用,因为索引以不同的方式修改(i+1, i-2, (i:-2:1,i* 2) 等,也取决于smth)。但这再次表明最终有可能将所有类型的修改聚合到前面的if-statement 中。
    【解决方案4】:

    我发现了另一种(有问题的)可能性:

    a=2:2:10;
    s=smth;
    a(5^s)
    for k=(5^s-s)*2^~s:(-1)^s:5^~s
        a(k)
    end
    

    【讨论】:

    • 对“混淆代码”路径表示赞赏 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2014-02-23
    相关资源
    最近更新 更多