2014-08-29 34 views
2

我正在茱莉亞的第一步,我想重現我用numpy取得的成果。在朱莉婭的屬性與數組

我想寫一個新的類似數組的類型,它基本上是一個任意類型的元素的向量,並且爲了使示例簡單,標量屬性(如採樣頻率fs)。

我開始用類似

type TimeSeries{T} <: DenseVector{T,} 
    data::Vector{T} 
    fs::Float64 
end 

理想情況下,我想:

1)採取Vector{T}作爲參數採取TimeSeries{T}的所有方法。

如:

ts = TimeSeries([1,2,3,1,543,1,24,5], 12.01) 
median(ts) 

2)索引一個TimeSeries總是返回TimeSeries

ts[1:3] 

3)內置函數返回一個Vector返回一個TimeSeries

ts * 2 
ts + [1,2,3,1,543,1,24,5] 

我已經開始執行sizegetindex等等,但我絕對不看它怎麼可能匹配點2和3

numpy有一個比較全面的方式來這樣做:http://docs.scipy.org/doc/numpy/user/basics.subclassing.htmlR也似乎允許將屬性attr()<-鏈接到數組。

對於實現這種「具有屬性的數組」的最佳策略,你有什麼想法嗎?

+1

我完全同意重新定義已經與Vector一起工作的所有方法是乏味的。 – juliohm 2014-09-01 16:50:48

回答

3

也許我不理解,爲什麼是說3點就不足以做

(*)(ts::TimeSeries, n) = TimeSeries(ts.data*n, ts.fs) 
(+)(ts::TimeSeries, n) = TimeSeries(ts.data+n, ts.fs) 

至於點2

Base.getindex(ts::TimeSeries, r::Range) = TimeSeries(ts.data[r], ts.fs) 

還是想提出一些更簡單的方法,你將所有這些操作委託給內部向量?你可以聰明的事情,如

for op in (:(+), :(*)) 
    @eval $(op)(ts::TimeSeries, x) = TimeSeries($(op)(ts.data,x), ts.fs) 
end 
+1

非常感謝,你能想出任何對所有可能用於向量的函數自動執行的方法(例如,如果'T'是一個'Float',可以應用'sin(TimeSeries)'並得到保證到一個新的'TimeSeries')? – 2014-08-30 15:41:51

+1

如果Julia擁有像Python這樣的「子類」功能,那將會很棒。重新定義一切並不能很好地擴展。 – juliohm 2014-09-01 16:52:53

+1

關於如何讓這個更好,例如https://github.com/JuliaLang/julia/pull/3292和它鏈接的東西。 @QuentinGeissmann,如果沒有你的干預,沒有辦法做到這一點,因爲它含糊不清。我只是將你的「委託」到內部向量的那個提議聯繫起來,這是一個用最小的努力解決含混問題的好方法。 – IainDunning 2014-09-01 17:32:11