问题:根据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
后翻转数组。
答案 0 :(得分: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
或者,您可以将临时三元运算符 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的形式提供。
答案 1 :(得分:1)
它不是很好,但这可能会有所帮助,
for i=smth*(1:5)+~smth*(5:-1:1)
a(i)
end
答案 2 :(得分:1)
怎么样(你可以用$config['cookie_domain'] = ''
的实际长度替换5
):
a
答案 3 :(得分:0)
我发现了另一个(可疑的)可能性:
a=2:2:10;
s=smth;
a(5^s)
for k=(5^s-s)*2^~s:(-1)^s:5^~s
a(k)
end