Julia thường rất nhanh trong các vòng lặp lồng nhau, vì vậy nếu chúng hoạt động chính xác cho bạn, bạn nên kiểm tra hiệu suất có thể chỉ gắn bó với nó.
tùy chọn khác sẽ được sử dụng repmat (cái này là nhanh hơn một chút so với sử dụng lặp lại):
[repmat(x,1,length(y))'[:] repmat(y,length(x),1)[:]]
Đã làm một số thử nghiệm nhanh của cả hai phương pháp:
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)
Không chắc tại sao rất nhiều khác biệt và tôi nghĩ vẫn còn chỗ để cải thiện. Chưa thử chức năng sản phẩm bên trong gói Iterators.jl.
Cũng là một chút biết thêm thông tin ở đây: https://groups.google.com/forum/#!topic/julia-users/dtl--SyFgwY
Hope this helps.
Cố gắng một vài vòng lồng nhau và thực sự là nhanh hơn:
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
Và, cho cùng rand(1000)
cho x
và y
.
withloops(x,y)
elapsed time: 0.011350679 seconds (16000128 bytes allocated)
' @ inbounds' có giúp vòng lặp 'for' không? – rickhg12hs
@ rickhg12hs Nó phải có, tôi đã vội vàng một chút khi tôi đăng nó, vì vậy tôi không có thời gian để kiểm tra nó đúng cách, nhưng tôi sẽ làm điều đó vào ngày mai và chỉnh sửa bài viết cho phù hợp. Cám ơn vì sự gợi ý. – Esteban
Tôi đã thử sử dụng '@ inbounds' nhưng không nhận được bất kỳ cải tiến đáng chú ý nào, có lẽ điều này là do không có hoạt động với mảng và tôi chỉ gán giá trị? Ngoài ra, trong máy tính của tôi sử dụng các vectơ có chiều dài 10000 làm đầu vào cho 'x' và' y', tạo ra lỗi bộ nhớ khi sử dụng 'repeat' hoặc' repmat' nhưng làm việc tốt với hàm lồng nhau. – Esteban