MATLAB 相当于 Python 的负索引



问题:根据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的评估之后翻转阵列是不可能的。

我想您要查找的是关键字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

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

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-也可用作函数句柄。

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

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

(您可以用a的实际长度替换5):

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

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

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

最新更新