cofactor.cpp 846 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. // Cofactor of a matrix component.
  2. #include "stdafx.h"
  3. #include "defs.h"
  4. void
  5. eval_cofactor(void)
  6. {
  7. int i, j, n;
  8. push(cadr(p1));
  9. eval();
  10. p2 = pop();
  11. if (istensor(p2) && p2->u.tensor->ndim == 2 && p2->u.tensor->dim[0] == p2->u.tensor->dim[1])
  12. ;
  13. else
  14. stop("cofactor: 1st arg: square matrix expected");
  15. n = p2->u.tensor->dim[0];
  16. push(caddr(p1));
  17. eval();
  18. i = pop_integer();
  19. if (i < 1 || i > n)
  20. stop("cofactor: 2nd arg: row index expected");
  21. push(cadddr(p1));
  22. eval();
  23. j = pop_integer();
  24. if (j < 1 || j > n)
  25. stop("cofactor: 3rd arg: column index expected");
  26. cofactor(p2, n, i - 1, j - 1);
  27. }
  28. void
  29. cofactor(U *p, int n, int row, int col)
  30. {
  31. int i, j;
  32. for (i = 0; i < n; i++)
  33. for (j = 0; j < n; j++)
  34. if (i != row && j != col)
  35. push(p->u.tensor->elem[n * i + j]);
  36. determinant(n - 1);
  37. if ((row + col) % 2)
  38. negate();
  39. }