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