Julia ist normalerweise sehr schnell in verschachtelten Loops, wenn sie also für Sie richtig funktionieren, sollten Sie die Leistung wahrscheinlich überprüfen, vielleicht einfach dabei bleiben.
Andere Option wäre repmat (dieses ein wenig schneller ist als die Verwendung von Wiederholung) werden:
[repmat(x,1,length(y))'[:] repmat(y,length(x),1)[:]]
Hat einige schnelle Prüfung beider Methoden:
x=rand(1000)
y=rand(1000)
function withrepeat(x,y)
[repeat(x, inner=[size(y,1)]) repeat(y, outer=[size(x,1)])]
end
function withrepmat(x,y)
[repmat(x,1,length(y))'[:] repmat(y,length(x),1)[:]]
end
withrepeat(x,y)
elapsed time: 0.21556302 seconds (95986112 bytes allocated)
with repmat(x,y)
elapsed time: 0.075604488 seconds (56000560 bytes allocated)
nicht sicher, warum so viel Unterschied und ich denke, es gibt noch Raum für Verbesserungen. Die Produktfunktion im Iterators.jl-Paket wurde nicht getestet.
auch ein bisschen mehr Informationen hier: https://groups.google.com/forum/#!topic/julia-users/dtl--SyFgwY
Hoffnung, das hilft.
Versucht ein paar verschachtelte Schleifen und ist in der Tat schneller:
function withloops (x,y)
leny=length(y)
lenx=length(x)
m=leny*lenx
OUT = zeros(Float64, m,2)
c=1
for i = 1:lenx
for j = 1:leny
OUT[c,1] = x[i]
OUT[c,2] = y[j]
c+=1
end
end
return OUT
end
Und für die gleiche rand(1000)
für x
und y
.
withloops(x,y)
elapsed time: 0.011350679 seconds (16000128 bytes allocated)
Hilft' @ inbound' die 'for' Schleife? – rickhg12hs
@ rickhg12hs Es sollte ja, ich war in ein wenig Eile, als ich es gepostet habe, also hatte ich keine Zeit, es richtig zu testen, aber ich werde es morgen tun und den Beitrag entsprechend bearbeiten. Danke für den Vorschlag. – Esteban
Ich habe versucht, @ @ inbounds zu verwenden, aber habe keine merkliche Verbesserung erhalten, vielleicht weil es keine Operationen mit den Arrays gibt und ich nur Werte zuweise? Auch in meinem Computer, der Vektoren mit der Länge 10000 als Eingabe für "x" und "y" verwendet, erzeugte Speicherfehler bei der Verwendung von "repeat" oder "repmat", aber funktionierte gut mit der Nested-Loop-Funktion. – Esteban