372#if defined (HAVE_CXSPARSE)
380 if (nr < 0 || nc < 0 || nr != b_nr)
381 (*current_liboctave_error_handler)
382 (
"matrix dimension mismatch in solution of minimum norm problem");
384 if (nr == 0 || nc == 0 || b_nc == 0)
385 retval = RT (nc, b_nc, 0.0);
396 csm.nzmax = a.nnz ();
400 csm.p =
const_cast<octave::suitesparse_integer *
>
401 (octave::to_suitesparse_intptr (a.cidx ()));
402 csm.i =
const_cast<octave::suitesparse_integer *
>
403 (octave::to_suitesparse_intptr (a.ridx ()));
415 dmsolve_permute (btmp, b, pinv);
418 retval.resize (nc, b_nc);
421 if (dm->rr[2] < nr && dm->cc[3] < nc)
423 ST m = dmsolve_extract (a, pinv, q, dm->rr[2], nr, dm->cc[3], nc,
424 nnz_remaining,
true);
425 nnz_remaining -= m.nnz ();
426 RT mtmp = octave::math::qrsolve (m, dmsolve_extract (btmp,
431 dmsolve_insert (retval, mtmp, q, dm->cc[3], 0);
433 if (dm->rr[2] > 0 && ! info)
435 m = dmsolve_extract (a, pinv, q, 0, dm->rr[2],
436 dm->cc[3], nc, nnz_remaining,
true);
437 nnz_remaining -= m.nnz ();
438 RT ctmp = dmsolve_extract (btmp,
nullptr,
nullptr,
439 0, dm->rr[2], 0, b_nc);
440 btmp.insert (ctmp - m * mtmp, 0, 0);
446 if (dm->rr[1] < dm->rr[2] && dm->cc[2] < dm->cc[3] && ! info)
448 ST m = dmsolve_extract (a, pinv, q, dm->rr[1], dm->rr[2],
449 dm->cc[2], dm->cc[3], nnz_remaining,
false);
450 nnz_remaining -= m.nnz ();
451 RT btmp2 = dmsolve_extract (btmp,
nullptr,
nullptr,
452 dm->rr[1], dm->rr[2],
456 RT mtmp = m.solve (mtyp, btmp2, info, rcond,
457 solve_singularity_warning,
false);
461 mtmp = octave::math::qrsolve (m, btmp2, info);
464 dmsolve_insert (retval, mtmp, q, dm->cc[2], 0);
465 if (dm->rr[1] > 0 && ! info)
467 m = dmsolve_extract (a, pinv, q, 0, dm->rr[1], dm->cc[2],
468 dm->cc[3], nnz_remaining,
true);
469 nnz_remaining -= m.nnz ();
470 RT ctmp = dmsolve_extract (btmp,
nullptr,
nullptr,
471 0, dm->rr[1], 0, b_nc);
472 btmp.insert (ctmp - m * mtmp, 0, 0);
477 if (dm->rr[1] > 0 && dm->cc[2] > 0 && ! info)
479 ST m = dmsolve_extract (a, pinv, q, 0, dm->rr[1], 0,
480 dm->cc[2], nnz_remaining,
true);
481 RT mtmp = octave::math::qrsolve (m, dmsolve_extract (btmp,
nullptr,
486 dmsolve_insert (retval, mtmp, q, 0, 0);
494 octave_unused_parameter (a);
495 octave_unused_parameter (b);
496 octave_unused_parameter (info);
498 (*current_liboctave_error_handler)
499 (
"support for CXSparse was unavailable or disabled when liboctave was built");