1

我想用 DrRacket(R5RS 但不仅如此)写一些不错的数学(球拍标签有点空)。

我真的很想编写一些矩阵的东西,比如:

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

和其他类似的东西来设置一些不错的 gimp 过滤器......

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

我期待着您的回复。此致, Andreas_P

4

2 回答 2

0

几点注意事项:

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

2) 赢得 Google AI Challenge 的 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))
于 2011-07-27T21:58:38.537 回答
-1

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

Python 的原则之一是不允许语言停留在您和您的问题之间,编写自己的矩阵操作代码是微不足道的。如果您想要高性能操作,您可以使用第三方库,例如 NumPy(甚至来自 GIMP 环境内部)来获取它。

因此,对于允许标量乘法和加一的 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 中都有相同的功能,只需将名称中的“-”替换为“_” )

于 2011-04-28T01:34:45.437 回答