2011-04-27 54 views
1

我想用DrRacket寫一些不錯的數學(R5RS但不僅)(球拍標籤有點空)。寫作矩陣轉換與計劃爲GIMP

我真的想代碼中的一些矩陣東西一樣:

(3 3 3)(5 3 4) (4 4 4) - >(5 3 4) (5 5 5)(5 3 4)

和其他的東西像這樣設置一些不錯的GIMP濾鏡......

一些人指出,這可以通過內列出清單來完成,但我想不出一個實際例子這裏...

我期待着您的回覆。您真誠地,Andreas_P

+0

目前尚不清楚,你問的問題。你能把這個改爲一個問題嗎? – 2011-04-28 06:28:57

+0

linux標記可能會不必要地限制問題的範圍:在Windows上也可以使用script-fu的gimp。 – Halberdier 2011-07-15 10:41:40

回答

-1

HHi,我強烈建議您使用Python而不是Scheme來編寫GIMP腳本,除非您想學習用於娛樂目的的Scheme。

Python中的一條原則是不允許語言留在你和你的問題之間,編寫你自己的Matrix操作代碼是微不足道的。如果你想要高性能的操作系統,你可以使用第三方庫,比如NumPy(甚至可以在GIMP環境中)來獲取它。

所以,對於一個矩陣類,將允許scallar乘法和添加一個可以簡單地寫:Python的互動式控制檯上

class Matrix(object): 
    def __init__(self, rows, cols, *args): 
     self.rows = rows 
     self.cols = cols 
     self.values = args 

    def __getitem__(self, (i,j)): 
     return self.values[i * self.cols + j] 

    def __setitem__(self,(i,j), value): 
     self.values[i * self.cols + j] = value 

    def __add__(self, other): 
     values = [] 
     for i in range(self.rows): 
      for j in range(self.cols): 
       values.append(self[i,j] + other[i,j]) 
     return Matrix(self.rows, self.cols, *values) 

    def __mul__(self, N): 
     return Matrix(self.rows, self.cols,*(N * v for v in self.values)) 

    def __repr__(self): 
     return "\n".join (" ".join(str(self[i,j]) for j in range(self.cols)) for i in range(self.rows)) 

例子:

>>> m = Matrix(3,3, 
... 3,3,3, 
... 5,3,4,   
... 4,4,4)  
>>> m * 3 
9 9 9 
15 9 12 
12 12 12 

實現更多的操作也同樣簡單, ,用這個例子類來調用GIMP的API函數,你可以直接使用m.values,這就是所有矩陣值依次排列的列表 - 這就是GIMP PDB函數使用它們的方式。 (例如pdb.gimp_drawable_transform_matrix或pdb.plug_in_convmatrix。(我想你已經在幫助菜單下找到了GIMP的API瀏覽器 - 在Scheme和Python中可以使用相同的函數,只需替換「_」中的「 - 」 )

+2

這只是一個* teensy *位flamebait-y ...如果我指向偉大的語言槍戰,它會不會將我們拖入糞坑?快速,笑臉:) :) :) – 2011-04-28 06:35:41

+0

很多感謝您的友好回答,我現在沒有太多時間......但我真的很想使用Scheme,因爲它是內置的,可以做很多非常酷的事情。 (btw:LISP今年贏得了Google AI挑戰賽)。而且我在大學課程中學習了一些「重型」課程。我非常喜歡python,但現在可以做得比現在更少...很長的回答(關於你的提議,我想很快做)。再次非常感謝WOW:這裏有多少GIMP優點? – 2011-04-29 08:59:52

+0

這最後的評論是爲了JSBueno – 2011-04-29 09:11:16

0

的幾個注意事項:

1)你是什麼意思與計劃「是建立在覈心內」? GIMP現在有腳本福

2)Lisp的贏得谷歌AI挑戰是Common Lisp的,沒有計劃

3)我不知道沿着原來的Python-FU,但腳本福控制檯狀態TinyScheme,因此我認爲它是非常重要的,對於更完整的Scheme實現,只需很少的庫支持。

無論如何,我嘗試了一些關於矩陣「Scheme Scheme」的例子。爲了簡單起見,他們缺乏對輸入數據的任何控制,但對於簡單的示例,它們在DrRacket上運行良好。

(define (vect-sum x y) 
    (cond 
    ((empty? x) empty) 
    (else 
    (cons (+ (first x) (first y)) (vect-sum (rest x) (rest y)))))) 

(define (scalar-prod a v) 
    (cond 
    ((empty? v) empty) 
    (else 
    (cons (* a (first v)) (scalar-prod a (rest v)))))) 

(define (matr-sum x y) 
    (cond 
    ((empty? x) empty) 
    (else 
    (cons (vect-sum (first x) (first y)) 
      (matr-sum (rest x) (rest y)))))) 

(define (matr-scalar-prod a m) 
    (cond 
    ((empty? m) empty) 
    (else 
    (cons (scalar-prod a (first m)) (matr-scalar-prod a (rest m)))))) 

現在對數據的簡單測試,如對方回答:

> (define m '((3 3 3)(5 3 4)(4 4 4))) 
> m 
'((3 3 3) (5 3 4) (4 4 4)) 
> (matr-scalar-prod 3 m) 
'((9 9 9) (15 9 12) (12 12 12))