MATLAB相当于Python的负索引

355*_*113 2 python arrays indexing matlab

问题:根据布尔值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)])  #*
Run Code Online (Sandbox Code Playgroud)

现在,由于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
Run Code Online (Sandbox Code Playgroud)

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

此外,在这种情况下,smth不可能在评估之后翻转阵列.

Dev*_*-iL 5

我认为你要找的是关键字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
Run Code Online (Sandbox Code Playgroud)

或者您可以使用一个临时搭建的三元运算符1结合flip,以获得正确的指标:

function out = iftr(cond,in1,in2)

if cond
    out = in1;
else
    out = in2;
end
Run Code Online (Sandbox Code Playgroud)

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

ind_vec = 1:5;
ind_vec = iftr(smth,ind_vec,flip(ind_vec));
ind_vec = ind_vec(2:end);
Run Code Online (Sandbox Code Playgroud)

1 - 也可用作功能句柄.