Julia è in genere molto veloce nei cicli nidificati, quindi se funzionano correttamente per te, dovresti controllare pro spettivamente le prestazioni, magari limitarti a seguirle.
altra opzione sarebbe utilizzando repmat (questo è un po 'più veloce rispetto all'utilizzo di ripetizione):
[repmat(x,1,length(y))'[:] repmat(y,length(x),1)[:]]
Ha fatto qualche rapido test di entrambi i metodi:
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)
Non capisco perché tanta differenza e penso che ci sia ancora spazio per miglioramenti. Non ho provato la funzione del prodotto all'interno del pacchetto Iterators.jl.
anche un po 'più informazioni qui: https://groups.google.com/forum/#!topic/julia-users/dtl--SyFgwY
Spero che questo aiuti.
provato un paio di cicli nidificati e in effetti è più veloce:
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
E, per lo stesso rand(1000)
per x
e y
.
withloops(x,y)
elapsed time: 0.011350679 seconds (16000128 bytes allocated)
' 'inbounds' aiuta il ciclo' for'? – rickhg12hs
@ rickhg12hs Dovrebbe sì, ho avuto un po 'di fretta quando l'ho pubblicato, quindi non ho avuto il tempo di testarlo correttamente, ma lo farò domani e modificherò il post di conseguenza. Grazie per il suggerimento. – Esteban
Ho provato a usare '@ inbounds' ma non ho ottenuto alcun miglioramento evidente, forse perché non ci sono operazioni con gli array e sto solo assegnando valori? Inoltre, nel mio computer usando vettori di lunghezza 10000 come input per 'x' e' y', ho prodotto errori di memoria quando si utilizzava 'repeat' o' repmat', ma funzionava bene con la funzione di cicli annidati. – Esteban