我想用Clojure來處理圖像,我想用Clojure數據結構表示圖像。基本上,我的第一種方法是使用矢量矢量和mapv
來操作每個像素值並返回具有相同數據結構的新圖像表示。但是,一些基本操作需要花費太多時間。有一種使用Clojure向量作爲矩陣的快速方法?
使用Jvisual分析器,我得到了下面的結果。有人可以給我一個提示,以提高性能?如果有必要,我可以提供更多詳細信息,但也許只是看看seq
和next
的成本,某人可以有一個很好的猜測。
我想用Clojure來處理圖像,我想用Clojure數據結構表示圖像。基本上,我的第一種方法是使用矢量矢量和mapv
來操作每個像素值並返回具有相同數據結構的新圖像表示。但是,一些基本操作需要花費太多時間。有一種使用Clojure向量作爲矩陣的快速方法?
使用Jvisual分析器,我得到了下面的結果。有人可以給我一個提示,以提高性能?如果有必要,我可以提供更多詳細信息,但也許只是看看seq
和next
的成本,某人可以有一個很好的猜測。
我真的認爲你應該爲此使用基元數組。儘管Clojure沒有突出顯示,但它仍然支持內置的數組支持,對於這種情況,您可以使用大量的數值數據。
任何其他方法,矢量,甚至java集合都會導致你所有的數字被單獨裝箱,這是非常浪費的。原始數組(int,double,byte,適當的)不存在這個問題,這就是爲什麼他們在那裏。人們對在clojure中使用數組感到不好意思,但他們出於某種原因在這裏,就是這樣。這將是一個好的可移植的clojure代碼 - int-array既可以在jvm clojure中運行,也可以在clojure-script中運行。
嘗試使用數組和基準。
更好的辦法是使用一個Clojure庫來包裝原始數組的處理,例如vectorz-clj – mikera 2013-05-01 02:45:31
Clojure的Transients報價全持久性和持續性不一樣,你將與一個標準的Java數組獲得之間的中間地帶。這允許您使用快速mutate-in-place操作(僅限於當前線程)構建映像,然後撥打persistent!
將其在常量時間內轉換爲適當的持久結構,以便在程序的其餘部分進行操作
看起來像你在處理圖像內容的過程中也看到了很多開銷,如果瞬變沒有足夠的差異,你可能會考慮使用普通的Java數組,並將訪問結構直接訪問數組元素。
引擎蓋下,'mapv'使用瞬態來生成新的向量。所以,從這個意義上說,我幾乎沒有任何改進措施。 Java數組似乎是一個更好的主意。 – boechat107 2013-05-01 21:30:53
你應該檢查出core.matrix和任何與矩陣計算相關的庫。 core.matrix是用於矩陣計算的通用Clojure API,支持多個後端實現。
Clojure的持久數據結構對於大多數目的來說都非常棒,但實際上並不適合快速處理大型矩陣。存在的主要問題是:
,你可能想在看看相關的庫是:
根據你想要做什麼,最好的方法可能是使用圖像矩陣將圖像轉換成vectorz-clj矩陣並在那裏進行處理。或者,Clisk可能能夠做你想要的東西(它有很多現成的過濾器/失真效果等)
免責聲明:我是大多數上述庫。但是我全身心地使用它們來進行認真的工作,所以非常願意保證它們的實用性並幫助解決所發現的任何問題。
不錯!我非常喜歡這個主意,我會檢查一下!但是,至少現在,我想要使用整數矩陣。 – boechat107 2013-05-01 22:10:45
出於好奇,你是否嘗試過新的[core.matrix](https://github.com/mikera/matrix-api)庫?這是非常新的,但他們試圖提出矩陣操縱的一般方案,這可能值得一看。 – JohnJ 2013-04-30 20:13:00