1

DrRacket (R5RS だけではありません) を使用して素敵な数学を書きたいと思います (Racket タグは少し空です)。

次のようなマトリックスをコーディングしたいと思います。

(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 には Script-fu とともにネイティブの Python-fu が含まれるようになりました

2) Google AI Challenge で優勝した Lisp は、Scheme ではなく Common Lisp です。

3) よくわかりませんが、Script-fu コンソールは TinyScheme を示しているため、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))
于 2011-07-27T21:58:38.537 に答える
-1

Hこんにちは、娯楽目的でSchemeを学びたいのでない限り、GIMPスクリプトを書くためにSchemeの代わりにPythonを使うことを強くお勧めします。

Python の信条の 1 つは、言語があなたとあなたの問題の間にとどまることを許さないことであり、独自の Matrix 操作コードを書くことは簡単です。高性能な操作が必要な場合は、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 に答える