ldvmat.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /* ldvmat.c CCMATH mathematics library source code.
  2. *
  3. * Copyright (C) 2000 Daniel A. Atkinson All rights reserved.
  4. * This code may be redistributed under the terms of the GNU library
  5. * public license (LGPL). ( See the lgpl.license file for details.)
  6. * ------------------------------------------------------------------------
  7. */
  8. void ldvmat(double *a, double *v, int n)
  9. {
  10. double *p0, *q0, *p, *q, *qq;
  11. double h, s;
  12. int i, j, k, mm;
  13. for (i = 0, mm = n * n, q = v; i < mm; ++i)
  14. *q++ = 0.;
  15. *v = 1.;
  16. q0 = v + n * n - 1;
  17. *q0 = 1.;
  18. q0 -= n + 1;
  19. p0 = a + n * n - n - n - 1;
  20. for (i = n - 2, mm = 1; i > 0; --i, p0 -= n + 1, q0 -= n + 1, ++mm) {
  21. if (*(p0 - 1) != 0.) {
  22. for (j = 0, p = p0, h = 1.; j < mm; ++j, ++p)
  23. h += *p * *p;
  24. h = *(p0 - 1);
  25. *q0 = 1. - h;
  26. for (j = 0, q = q0 + n, p = p0; j < mm; ++j, q += n)
  27. *q = -h * *p++;
  28. for (k = i + 1, q = q0 + 1; k < n; ++k) {
  29. for (j = 0, qq = q + n, p = p0, s = 0.; j < mm; ++j, qq += n)
  30. s += *qq * *p++;
  31. s *= h;
  32. for (j = 0, qq = q + n, p = p0; j < mm; ++j, qq += n)
  33. *qq -= s * *p++;
  34. *q++ = -s;
  35. }
  36. }
  37. else {
  38. *q0 = 1.;
  39. for (j = 0, p = q0 + 1, q = q0 + n; j < mm; ++j, q += n)
  40. *q = *p++ = 0.;
  41. }
  42. }
  43. }