2014-02-14 58 views
32

給定矩陣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) ] 
+4

mapslices? 'mapslices(sum,m,2)'後者 – jverzani

+0

@jverzani mapslices完成這項工作,儘管在某些情況下它需要我定義一個匿名函數。感謝您的建議。 – Nico

回答

38

您自己列出的解決方案以及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 

我們遍歷他們的原生存儲順序都mmsum,所以每個我們使用所有的值加載一個緩存行,產生緩存命中率爲1.你可能會天真地認爲最好按行優先順序遍歷它,並將結果累加到tmp變量,但在任何現代機器上緩存小姐比msum[i]查找貴得多。

許多Julia的內部算法需要region參數,如sum(m, 2),爲您處理。

+1

我認爲這回答了我的問題,我會等待另一天接受答案。我非常喜歡這個答案,因爲它使我意識到,由於Julia是列專業,我最好將數據向量排列爲列而不是行。 – Nico

+0

您已鏈接到的博文已不存在。請參閱http://docs.julialang.org/zh/release-0.4/manual/performance-tips/#access-arrays-in-memory-order-along-columns。 – aventurin

+2

404似乎是由於斜線。該網址適用於:http://julialang.org/blog/2013/09/fast-numeric –

2

根據我的經驗,明確的迭代比理解要快得多。

並迭代列也是一個很好的建議。

此外,您可以使用新的宏@simd和@inbounds來進一步加速它。

相關問題