2014-01-28 11 views
6

Я нашел this проект на GitHub; это был единственный поисковый термин, возвращаемый для «матрицы нимрода». Я взял его кости и немного изменил его, чтобы он скомпилировался без ошибок, а затем я добавил две последние строки для создания простой матрицы, а затем вывел значение, но функция «getter» не работает по какой-то причине. Я адаптировал инструкции для добавления найденных свойств here, но что-то не так.Как вы используете матрицы в Нимроде?

Вот мой код. Я бы хотел использовать Научную библиотеку GNU из Nimrod, и я подумал, что это был первый логический шаг.

type 
    TMatrix*[T] = object 
    transposed: bool 
    dataRows: int 
    dataCols: int 
    data: seq[T] 

proc index[T](x: TMatrix[T], r,c: int): int {.inline.} = 
    if r<0 or r>(x.rows()-1): 
    raise newException(EInvalidIndex, "matrix index out of range") 
    if c<0 or c>(x.cols()-1): 
    raise newException(EInvalidIndex, "matrix index out of range") 
    result = if x.transposed: c*x.dataCols+r else: r*x.dataCols+c 

proc rows*[T](x: TMatrix[T]): int {.inline.} = 
    ## Returns the number of rows in the matrix `x`. 
    result = if x.transposed: x.dataCols else: x.dataRows 

proc cols*[T](x: TMatrix[T]): int {.inline.} = 
    ## Returns the number of columns in the matrix `x`. 
    result = if x.transposed: x.dataRows else: x.dataCols 

proc matrix*[T](rows, cols: int, d: openarray[T]): TMatrix[T] = 
    ## Constructor. Initializes the matrix by allocating memory 
    ## for the data and setting the number of rows and columns 
    ## and sets the data to the values specified in `d`. 
    result.dataRows = rows 
    result.dataCols = cols 
    newSeq(result.data, rows*cols) 
    if len(d)>0: 
    if len(d)<(rows*cols): 
     raise newException(EInvalidIndex, "insufficient data supplied in matrix  constructor") 

    for i in countup(0,rows*cols-1): 
     result.data[i] = d[i] 

proc `[][]`*[T](x: TMatrix[T], r,c: int): T = 
    ## Element access. Returns the element at row `r` column `c`. 
    result = x.data[x.index(r,c)] 

proc `[][]=`*[T](x: var TMatrix[T], r,c: int, a: T) = 
    ## Sets the value of the element at row `r` column `c` to 
    ## the value supplied in `a`. 
    x.data[x.index(r,c)] = a 

var m = matrix(2, 2, [1,2,3,4]) 

echo($m[0][0]) 

Это ошибка, я получаю:

c:\program files (x86)\nimrod\config\nimrod.cfg(36, 11) Hint: added path:  'C:\Users\H127\.babel\libs\' [Path] 
Hint: used config file 'C:\Program Files (x86)\Nimrod\config\nimrod.cfg' [Conf] 
Hint: system [Processing] 
Hint: mat [Processing] 
mat.nim(48, 9) Error: type mismatch: got (TMatrix[int], int literal(0)) 
but expected one of: 
system.[](a: array[Idx, T], x: TSlice[Idx]): seq[T] 
system.[](a: array[Idx, T], x: TSlice[int]): seq[T] 
system.[](s: string, x: TSlice[int]): string 
system.[](s: seq[T], x: TSlice[int]): seq[T] 

Спасибо вам, ребята!

ответ

2

Я хотел бы сначала указать, что the matrix library you refer to составляет три года. Для языка программирования в развитии, что очень много времени из-за изменения, и он не компилируется больше с текущим Nimrod git version:

$ nimrod c matrix 
... 
private/tmp/n/matrix/matrix.nim(97, 8) Error: ']' expected 

Он терпит неудачу на двойном аксессоре массива, который, похоже, изменил синтаксис. Думаю, ваша попытка создать двойной аксессуар [][] проблематична, это может быть неоднозначно: вы обращаетесь к объекту двойного массива объекта или получаете доступ к вложенному массиву, возвращенному первыми скобками? Я должен был изменить proc к следующему:

proc `[]`*[T](x: TMatrix[T], r,c: int): T = 

После этого изменения вы также должны изменить способ доступа к матрице. Вот что я получил:

for x in 0 .. <2: 
    for y in 0 .. <2: 
    echo "x: ", x, " y: ", y, " = ", m[x,y] 

В принципе, вместо того, чтобы указать два кронштейна обращающихся вы передаете все параметры внутри одного кронштейна. Этот код генерирует:

x: 0 y: 0 = 1 
x: 0 y: 1 = 2 
x: 1 y: 0 = 3 
x: 1 y: 1 = 4 

Что касается нахождения программного обеспечения для Нимрода, я хотел бы рекомендовать вам с помощью Nimble, Nimrod's package manager. После его установки вы можете искать доступные и поддерживаемые пакеты. В команде nimble search math показаны две потенциальные упаковки: linagl и extmath. Не уверен, что они то, что вы ищете, но по крайней мере они выглядят более свежие.

+0

Да, я видел, что это было старым, я просто взял основы и попытался поиграть с ними. Я нашел extmath, но у меня не было того, что мне было нужно; Я обязательно посмотрю на linalg. Благодаря! – cjohnson318

+0

Еще раз спасибо за полноту, я добавлю, что «setter» 'proc' нужно изменить на' proc \ '[] = \' * [T] (x: var TMatrix [T], r, c: int, a: T) = '. – cjohnson318