Доступ к переменным i и j в матричной карте Maxima? - PullRequest
0 голосов
/ 28 августа 2010

Я все еще новичок Максима, так что терпите меня. Я пытаюсь написать собственную формулу для вычисления сопряженной матрицы (я знаю, что у максимумов уже есть одна встроенная, но я пробовал свою собственную в качестве учебного упражнения). Пока у меня есть (для матрицы 3х3):

/* cofactor of some submatrix of the matrix, by deleting row i and column j */
cof(i, j, M) := determinant(submatrix(i, M, j));

/* for 3 x 3 matrix */
C3(M) := matrix( [cof(1,1,M), cof(1,2,M), cof(1,3)],
                 [cof(2,1,M), cof(2,2,M), cof(2,3)],
                 [cof(3,1,M), cof(3,2,M), cof(3,3)] );

/* function for calculating adjoint sign for x at position i, j */
adj_f(i, j, x) := -1^(i+j) * x;

/* adjugate for a 3x3 matrix M */
adj3(M) := matrixmap(lambda([i,j,x], adj_f(i,j,x), transpose(C3(M))));

Я знаю, что это, вероятно, не лучший способ сделать это; Однако мне было интересно, есть ли способ доступа к элементам i и j при использовании matrixmap или fullmapl?

(я использую wxMaxima, и у меня нет большого опыта работы с lisp, я пытался сойти с рук, не касаясь кода).

Ответы [ 2 ]

1 голос
/ 31 мая 2012

Попробуйте genmatrix вместо matrixmap. Первый аргумент genmatrix - это функция, которая принимает i и j в качестве аргументов.

(%i2) cof (i, j, M) := determinant (submatrix (i, M, j)) $
(%i3) adj_sign (i, j) := (-1)^(i + j) $
(%i4) M : matrix([1, 2, 3], [-1, 2, 3], [1, -2, 3]) $
(%i5) my_inverse (M) := (1 / determinant (M)) * genmatrix (lambda ([i, j], cof (j, i, M) *  adj_sign (i, j)), 3, 3) $
(%i6) M1 : my_inverse (M);
(%o6) matrix([1/2,-1/2,0],[1/4,0,-1/4],[0,1/6,1/6])

Извините за поздний ответ. Оставьте это здесь на случай, если кто-то найдет его в поиске.

1 голос
/ 04 апреля 2011

Ну, вы не можете сделать это с matrixmap

 -- Function: matrixmap (<f>, <M>)
     Returns a matrix with element `i,j' equal to `<f>(<M>[i,j])'.

     See also `map', `fullmap', `fullmapl', and `apply'.

, поскольку i и j не являются функциями (i, j) -го элемента M.

Императивное решение может выглядеть следующим образом:

adj3(M) :=
block([adjugate: transpose(C3(M))],
  for i: 1 thru 3 do
    for j: 1 thru 3 do
      adjugate[i,j]: adj_f(i,j,adjugate[i,j]),
  adjugate)$

Обратите внимание, что в вашей функции C3 отсутствовали некоторые буквы "M", и значение adj_f должно быть

adj_f(i, j, x) := (-1)^(i+j) * x;

(в противном случае это - ((1) ^ (i + j)) = -1 для всех i, j).

...