Julia jest zwykle bardzo szybka w zagnieżdżonych pętlach, więc jeśli działają one poprawnie, powinieneś sprawdzić wydajność, może po prostu się z tym uporać.
Inną opcją byłoby korzystania repmat (ten jest trochę szybsze niż przy użyciu powtarzanie):
[repmat(x,1,length(y))'[:] repmat(y,length(x),1)[:]]
Czy niektóre szybkie testowanie obu metod:
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)
Nie wiem, dlaczego tak duża różnica i myślę, że wciąż jest miejsce na poprawę. Nie próbowałem funkcji produktu w pakiecie Iterators.jl.
także trochę więcej informacji tutaj: https://groups.google.com/forum/#!topic/julia-users/dtl--SyFgwY
Nadzieja to pomaga.
Próbowaliśmy kilka zagnieżdżonych pętlach i rzeczywiście jest szybsze:
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
I dla tego samego rand(1000)
dla x
i y
.
withloops(x,y)
elapsed time: 0.011350679 seconds (16000128 bytes allocated)
Czy' @sbounds' pomaga w pętli 'for'? – rickhg12hs
@ rickhg12hs To powinno być tak, byłem trochę pośpiechu, kiedy opublikowałem, więc nie miałem czasu, aby przetestować go poprawnie, ale zrobię to jutro i odpowiednio edytować post. Dzieki za sugestie. – Esteban
Próbowałem używać '@ inbounds', ale nie zauważyłem żadnej poprawy, może dlatego, że nie ma żadnych operacji z tablicami i po prostu przypisuję wartości? Również w moim komputerze używającym wektorów o długości 10000 jako danych wejściowych dla 'x' i' y', powodowało błędy pamięci przy użyciu 'repeat' lub' repmat', ale działało dobrze z funkcją zagnieżdżonych pętli. – Esteban