2016-07-15 7 views
2

ich für eine idiomatische und kompakte Art und Weise in Julia zu erreichen suchen, was ich mitJulia - Äquivalent von R rep() mit mal Argument

v1=1:5;v2=5:1;out=rep(v1,times=v2);out 
# 1 1 1 1 1 2 2 2 2 3 3 3 4 4 5 

dh replizieren jedes Element in Vektor v1 eine Zahl in R tun würde von Zeiten gegeben durch das entsprechende Element in Vektor v2. Irgendwelche Gedanken?

Antwort

2

Versuchen VectorizedRoutines.jl mit:

# Pkg.clone("https://github.com/ChrisRackauckas/VectorizedRoutines.jl") 
# Will be Pkg.add("VectorizedRoutines") after being added to package system 
using VectorizedRoutines 
v1=1:5 
v2 = 5:-1:1 
R.rep(v1,each = v2) 

Die Implementierung aus der RLEVectors.jl über den Vorschlag von aireties basiert (verbessert die Eingabe ein wenig, so dass Sie nicht sammeln müssen).

Dies ist ein Paket, das ich gestartet habe, um alle vektorisierten Routinen von R/MATLAB/Python zusammenzubringen, so dass die Portierung von Funktionen (und Ideen) für Julia einfacher ist. Fühlen Sie sich frei, Probleme im Github-Repository zu öffnen, um Vorschläge für zu implementierende Funktionen zu erhalten, Funktionen, die in anderen Paketen implementiert sind, die ich kennen sollte, Syntax, die nicht mit anderen Sprachen übereinstimmt oder wenn es andere Probleme gibt. Sie können auch eine Pull-Anfrage machen, wenn Sie solche Funktionen implementieren. Wenn Sie Hilfe brauchen, haben Sie keine Angst, machen Sie eine Pull-Anfrage mit der Grundfunktion und ich kann Ihnen helfen.

+0

Vielen Dank dafür - das ist in der Tat viel schneller und viel effizienter! –

+0

Wenn Sie Zeit haben würden Sie auch einen kurzen Blick auf http://codereview.stackexchange.com/questions/134926/benchmarks-of-technical-programming-languages-r-julia-mathematica-matlab-fo - I Ich habe einen R zu Julia Port von einem kleinen Beispielprogramm, aber ich bekomme schlechte Benchmark-Ergebnisse in Julia - Sie könnten mir wahrscheinlich sofort sagen, was ich falsch mache? –

2

Hier ist eine Option Array Comprehensions:

v1 = 1:5; 
v2 = 5:-1:1; 

out = vcat([ [v1[idx] for n = 1:v2[idx]] for idx = 1:length(v1) ]...) 

Auch, wenn Sie etwas näher an der R-Syntax möchten, können Sie die rep() Funktion aus dem RLEVectors Paket verwenden können:

## Pkg.add("RLEVectors") 
using RLEVectors 
out2 = rep(collect(v1), each = collect(v2)) 

Wie ist, out2 wird ein Vektor mit Run Length Encoding sein. Es funktioniert ähnlich wie die meisten anderen Vektoren, mit Speicher- und Berechnungs-Beschleunigungen in einigen Fällen. Aber, wenn Sie einen regelmäßigen Vektor von ihm wollen, verwenden Sie einfach .

+0

Vielen Dank dafür - sehr geschätzt! Julia nur hier lernen ... –

+0

@TomWenseleers Sicher Sache. Siehe auch meine aktualisierte Antwort mit einer anderen Option, die näher an der Ihnen bekannten R-Syntax liegt. –