給定矩陣m = [10i+j for i=1:3, j=1:4]
,我可以通過它的行迭代通過分割矩陣:在行上迭代矩陣的推薦方式是什麼?
for i=1:size(m,1)
print(m[i,:])
end
這是唯一的可能?這是推薦的方式嗎?
而理解呢?切片是迭代矩陣行的唯一可能性嗎?
[ sum(m[i,:]) for i=1:size(m,1) ]
給定矩陣m = [10i+j for i=1:3, j=1:4]
,我可以通過它的行迭代通過分割矩陣:在行上迭代矩陣的推薦方式是什麼?
for i=1:size(m,1)
print(m[i,:])
end
這是唯一的可能?這是推薦的方式嗎?
而理解呢?切片是迭代矩陣行的唯一可能性嗎?
[ sum(m[i,:]) for i=1:size(m,1) ]
您自己列出的解決方案以及mapslices
都可以正常工作。但如果通過「推薦」你真正的意思是「高性能」,那麼最好的答案是:不要遍歷行。
問題是,由於數組按主列次序存儲,對於小矩陣以外的任何其他數據,如果按行優先順序遍歷數組,則最終會出現差cache hit ratio。
作爲一個excellent blog post指出,如果你想總結了行,你最好的辦法是做這樣的事情:
msum = zeros(eltype(m), size(m, 1))
for j = 1:size(m,2)
for i = 1:size(m,1)
msum[i] += m[i,j]
end
end
我們遍歷他們的原生存儲順序都m
和msum
,所以每個我們使用所有的值加載一個緩存行,產生緩存命中率爲1.你可能會天真地認爲最好按行優先順序遍歷它,並將結果累加到tmp
變量,但在任何現代機器上緩存小姐比msum[i]
查找貴得多。
許多Julia的內部算法需要region
參數,如sum(m, 2)
,爲您處理。
根據我的經驗,明確的迭代比理解要快得多。
並迭代列也是一個很好的建議。
此外,您可以使用新的宏@simd和@inbounds來進一步加速它。
mapslices? 'mapslices(sum,m,2)'後者 – jverzani
@jverzani mapslices完成這項工作,儘管在某些情況下它需要我定義一個匿名函數。感謝您的建議。 – Nico