在朱莉娅变量中的数组结束

时间:2015-12-04 10:53:34

标签: arrays julia

我想在循环中对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],这将是数组的结尾。

我该如何解决这个问题?

3 个答案:

答案 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完成,但&&非常明确。