2013-04-30 46 views
2

我想用Clojure來處理圖像,我想用Clojure數據結構表示圖像。基本上,我的第一種方法是使用矢量矢量和mapv來操作每個像素值並返回具有相同數據結構的新圖像表示。但是,一些基本操作需要花費太多時間。有一種使用Clojure向量作爲矩陣的快速方法?

使用Jvisual分析器,我得到了下面的結果。有人可以給我一個提示,以提高性能?如果有必要,我可以提供更多詳細信息,但也許只是看看seqnext的成本,某人可以有一個很好的猜測。

Profiling results of an operation over the vector of vectors.

+1

出於好奇,你是否嘗試過新的[core.matrix](https://github.com/mikera/matrix-api)庫?這是非常新的,但他們試圖提出矩陣操縱的一般方案,這可能值得一看。 – JohnJ 2013-04-30 20:13:00

回答

3

我真的認爲你應該爲此使用基元數組。儘管Clojure沒有突出顯示,但它仍然支持內置的數組支持,對於這種情況,您可以使用大量的數值數據。

任何其他方法,矢量,甚至java集合都會導致你所有的數字被單獨裝箱,這是非常浪費的。原始數組(int,double,byte,適當的)不存在這個問題,這就是爲什麼他們在那裏。人們對在clojure中使用數組感到不好意思,但他們出於某種原因在這裏,就是這樣。這將是一個好的可移植的clojure代碼 - int-array既可以在jvm clojure中運行,也可以在clojure-script中運行。

嘗試使用數組和基準。

+0

更好的辦法是使用一個Clojure庫來包裝原始數組的處理,例如vectorz-clj – mikera 2013-05-01 02:45:31

1

Clojure的Transients報價全持久性和持續性不一樣,你將與一個標準的Java數組獲得之間的中間地帶。這允許您使用快速mutate-in-place操作(僅限於當前線程)構建映像,然後撥打persistent!將其在常量時間內轉換爲適當的持久結構,以便在程序的其餘部分進行操作

看起來像你在處理圖像內容的過程中也看到了很多開銷,如果瞬變沒有足夠的差異,你可能會考慮使用普通的Java數組,並將訪問結構直接訪問數組元素。

+0

引擎蓋下,'mapv'使用瞬態來生成新的向量。所以,從這個意義上說,我幾乎沒有任何改進措施。 Java數組似乎是一個更好的主意。 – boechat107 2013-05-01 21:30:53

7

你應該檢查出core.matrix和任何與矩陣計算相關的庫。 core.matrix是用於矩陣計算的通用Clojure API,支持多個後端實現。

Clojure的持久數據結構對於大多數目的來說都非常棒,但實際上並不適合快速處理大型矩陣。存在的主要問題是:

  • 不變性:通常是個好東西,但可以爲你需要做的事情一樣累積結果在性能方面的原因一個可變數組低級代碼殺手。
  • 拳擊:Clojure的數據結構大致盒的結果(如java.lang.Double中等),其增加了大量的開銷相比,使用原語
  • 序列:遍歷最Clojure的數據結構序列所涉及的創建臨時堆對象來保存序列元素。通常不是問題,但是當你處理大型矩陣時,它會變得有問題。

,你可能想在看看相關的庫是:

  • vectorz-clj:一個非常快的矩陣庫,它可以作爲一個完整的core.matrix實現。底層代碼是純Java,但有一個很好的Clojure包裝器。我相信它是目前在Clojure中進行通用矩陣計算而不訴諸本地代碼的最快方法。在底層,它使用Java原語的數組,但你不需要直接處理它。
  • Clatrix:Clojure的另一個快速矩陣庫,它也是一個core.matrix實現。引擎蓋下使用JBLAS。
  • image-matrix:將Java BufferedImage表示爲core.matrix實現,因此您可以對圖像執行矩陣操作。現在有點實驗,但應該適用於基本使用案例
  • Clisk:一個程序圖像處理庫。與其說是矩陣庫本身,不如說它對於使用基於Clojure的DSL來創建和操縱數字圖像非常有用。

根據你想要做什麼,最好的方法可能是使用圖像矩陣將圖像轉換成vectorz-clj矩陣並在那裏進行處理。或者,Clisk可能能夠做你想要的東西(它有很多現成的過濾器/失真效果等)

免責聲明:我是大多數上述庫。但是我全身心地使用它們來進行認真的工作,所以非常願意保證它們的實用性並幫助解決所發現的任何問題。

+0

不錯!我非常喜歡這個主意,我會檢查一下!但是,至少現在,我想要使用整數矩陣。 – boechat107 2013-05-01 22:10:45