我想在循环中对Julia中的数组a
进行切片,使其分成n
个样本的块。数组nsamples
的长度不是n
的倍数,因此最后一个步幅会更短。
我的尝试是使用三元运算符来检查步幅的大小是否大于数组的长度:
for i in 0:n:nsamples-1
end_ = i+n < nsamples ? i+n : end
window = a[i+1:end_]
end
这样,如果我超出了数组的大小,a[i+1:end_]
将解析为a[i+1:end]
。
但是,在第2行中使用关键字“end”是不可接受的(它也是julia中“控制结束语句”的关键字。
在python中,我可以将None
分配给end_
,这将解析为a[i+1:None]
,这将是数组的结尾。
我该如何解决这个问题?
答案 0 :(得分:8)
end
关键字仅在索引表达式中使用此类特殊处理,其中它计算为要索引的维度的最后一个索引。你可以把它放在里面,例如。
for i in 0:n:nsamples-1
window = a[i+1:min(i+n, end)]
end
或者您可以使用length(a)
(或nsamples
,我猜它们是相同的?)而不是end
来明确您所指的end
。
答案 1 :(得分:1)
丑陋的方式:
a=rand(7);
nsamples=7;
n=3;
for i in 0:n:nsamples-1
end_ = i+n < nsamples ? i+n : :end
window = @eval a[$i+1:$end_]
println(window)
end
更好的解决方案:
for i in 0:n:nsamples-1
window = i+n < nsamples ? a[i+1:i+n] : a[i+1:end]
println(window)
end
答案 2 :(得分:1)
为了简化循环(并且可能提高性能),可以在循环之后处理最后的部分窗口。这是推荐的,因为它通常需要一些特殊的处理。在代码中:
i = 0 # define loop variable outside for to retain it after
for i=n:n:length(a)
println(a[(i-n+1):i])
end
i < length(a) && println(a[(i+1):end])
最后一位可以使用if
完成,但&&
非常明确。