0

我仍然是一个极大的新手,所以请多多包涵。我正在尝试编写自己的公式来计算矩阵的伴随(我知道 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 经验,我试图在不接触任何代码的情况下摆脱这个问题)。

4

2 回答 2

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

这么晚才回复很抱歉。将其留在这里以防有人通过搜索找到它。

于 2012-05-31T06:08:28.913 回答
1

好吧,你不能用矩阵图来做

 -- 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;

(否则,所有 i,j 为 -( (1)^(i+j) ) = -1)。

于 2011-04-04T09:19:05.390 回答