访问Maxima矩阵图中的i和j变量?

时间:2010-08-28 03:09:22

标签: matrix maxima

我仍然是一个最大的新手所以忍受我。我正在尝试编写自己的公式来计算矩阵的伴随(我知道maxima已经有一个内置的,但我正在尝试自己作为一个学习练习)。到目前为止,我有(对于3x3矩阵):

/* 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))));

我知道这可能不是最好的方式;但是,我想知道在使用matrixmap或fullmapl时是否有办法访问i和j元素?

(我正在使用wxMaxima并且我没有大量的lisp经验,我试图在不触及任何代码的情况下逃脱此事。)

2 个答案:

答案 0 :(得分:1)

嗯,你不能用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不是M的第(i,j)个元素的函数。

必要的解决方案可能如下所示:

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)。

答案 1 :(得分:1)

尝试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])

很抱歉迟到的回复。将此留在这里以防有人通过搜索找到它。

相关问题