使用Scheme for GIMP编写Matrix转换

时间:2011-04-27 19:49:08

标签: linux matrix scheme racket gimp

我想用DrRacket写一些不错的数学(不仅仅是R5RS)(Racket Tag有点空)。

我真的想编写一些矩阵之类的东西:

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

这样的其他东西可以设置一些漂亮的gimp过滤器......

有些人指出,这可以通过列表中的列表来完成,但我想不出这里的实际例子......

我期待着你的回复。 您诚挚的,Andreas_P

2 个答案:

答案 0 :(得分:0)

一些注意事项:

1)你的意思是什么方案“内置于核心”? GIMP现在有一个原生的Python-fu和Script-fu

2)赢得Google AI挑战的Lisp是Common Lisp,而不是Scheme

3)我不确定,但Script-fu控制台陈述了TinyScheme,因此对于更完整的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))

答案 1 :(得分:-1)

HHi,我强烈建议您使用Python而不是Scheme来编写GIMP脚本,除非您想学习Scheme用于娱乐目的。

Python中的一个原则是不允许语言保持在你和你的问题之间,编写你自己的Matrix操作代码是微不足道的。如果你想要高性能的操作,你可以使用第三方库,比如NumPy(甚至可以在GIMP环境中)来获取它。

因此,对于允许scallar乘法并添加一个的Matrix类,可以简单地写:

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) ) 

Python的交互式控制台上的示例:

>>> 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中可以使用相同的函数,只需在“_”的名称中替换“ - ”) )