csPermute.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.csPermute = csPermute;
  6. /**
  7. * Permutes a sparse matrix C = P * A * Q
  8. *
  9. * @param {SparseMatrix} a The Matrix A
  10. * @param {Array} pinv The row permutation vector
  11. * @param {Array} q The column permutation vector
  12. * @param {boolean} values Create a pattern matrix (false), values and pattern otherwise
  13. *
  14. * @return {Matrix} C = P * A * Q, null on error
  15. *
  16. * Reference: http://faculty.cse.tamu.edu/davis/publications.html
  17. */
  18. function csPermute(a, pinv, q, values) {
  19. // a arrays
  20. var avalues = a._values;
  21. var aindex = a._index;
  22. var aptr = a._ptr;
  23. var asize = a._size;
  24. var adt = a._datatype;
  25. // rows & columns
  26. var m = asize[0];
  27. var n = asize[1];
  28. // c arrays
  29. var cvalues = values && a._values ? [] : null;
  30. var cindex = []; // (aptr[n])
  31. var cptr = []; // (n + 1)
  32. // initialize vars
  33. var nz = 0;
  34. // loop columns
  35. for (var k = 0; k < n; k++) {
  36. // column k of C is column q[k] of A
  37. cptr[k] = nz;
  38. // apply column permutation
  39. var j = q ? q[k] : k;
  40. // loop values in column j of A
  41. for (var t0 = aptr[j], t1 = aptr[j + 1], t = t0; t < t1; t++) {
  42. // row i of A is row pinv[i] of C
  43. var r = pinv ? pinv[aindex[t]] : aindex[t];
  44. // index
  45. cindex[nz] = r;
  46. // check we need to populate values
  47. if (cvalues) {
  48. cvalues[nz] = avalues[t];
  49. }
  50. // increment number of nonzero elements
  51. nz++;
  52. }
  53. }
  54. // finalize the last column of C
  55. cptr[n] = nz;
  56. // return C matrix
  57. return a.createSparseMatrix({
  58. values: cvalues,
  59. index: cindex,
  60. ptr: cptr,
  61. size: [m, n],
  62. datatype: adt
  63. });
  64. }