Написание преобразований матриц со схемой для GIMP

#linux #matrix #scheme #racket #gimp

#linux #матрица #схема #racket #gimp

Вопрос:

Я хочу написать некоторую приятную математику с помощью DrRacket (R5RS, но не только) (тег Racket немного пуст).

Я бы действительно хотел закодировать некоторые матричные материалы, такие как:

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

И другие подобные вещи, чтобы настроить несколько хороших фильтров gimp…

Некоторые люди отмечали, что это можно было бы сделать с помощью списков внутри списков, но я не могу придумать здесь практический пример…

Я с нетерпением жду вашего ответа. Искренне ваш, Andreas_P

Комментарии:

1. Неясно, какой вопрос вы задаете. Можете ли вы перефразировать это как вопрос?

2. Тег linux может излишне ограничить область вопроса: gimp со script-fu также доступен в Windows.

Ответ №1:

Несколько замечаний:

1) что вы подразумеваете под схемой «встроена в ядро»? GIMP теперь имеет собственный Python-fu наряду со Script-fu

2) Lisp, выигравший Google AI Challenge, — это 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))
  

Ответ №2:

Здравствуйте, я бы настоятельно рекомендовал вам использовать 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.plug_in_convmatrix. (Я полагаю, вы нашли браузер GIMP API в меню справки — те же функции доступны в Scheme и в Python, просто замените «-» в именах на «_»)

Комментарии:

1. Это всего лишь крошечная уловка … не затянет ли это нас еще глубже в грязь, если я укажу на великую языковую перестрелку? быстро, смайлики 🙂 🙂 🙂

2. Большое спасибо за ваш любезный ответ, у меня сейчас не так много времени… но я действительно хочу использовать Scheme, потому что она встроена в ядро и может делать много действительно классных вещей. (кстати: LISP выиграл Google AI Challenge в этом году). И я изучаю Scheme на своих университетских курсах на каком-то уровне «тяжелого режима». Я действительно люблю Python, но пока могу с ним делать меньше, чем Scheme… Длинный ответ (и относительно вашего предложения, которое я хочу сделать очень скоро). Еще раз большое спасибо и ВАУ: сколько здесь профессионалов GIMP?

3. Этот последний комментарий предназначался JSBueno