Mercurial > hg > octave-nkf
comparison liboctave/CMatrix.cc @ 7071:c3b479e753dd
[project @ 2007-10-26 15:14:34 by jwe]
author | jwe |
---|---|
date | Fri, 26 Oct 2007 15:14:35 +0000 |
parents | f0142f2afdc6 |
children | b48d486f641d |
comparison
equal
deleted
inserted
replaced
7070:7593f8e83a2e | 7071:c3b479e753dd |
---|---|
118 const octave_idx_type&, const double&, double&, | 118 const octave_idx_type&, const double&, double&, |
119 Complex*, double*, octave_idx_type& | 119 Complex*, double*, octave_idx_type& |
120 F77_CHAR_ARG_LEN_DECL); | 120 F77_CHAR_ARG_LEN_DECL); |
121 | 121 |
122 F77_RET_T | 122 F77_RET_T |
123 F77_FUNC (zgelsy, ZGELSY) (const octave_idx_type&, const octave_idx_type&, const octave_idx_type&, | 123 F77_FUNC (zgelss, ZGELSS) (const octave_idx_type&, const octave_idx_type&, const octave_idx_type&, |
124 Complex*, const octave_idx_type&, Complex*, | 124 Complex*, const octave_idx_type&, Complex*, |
125 const octave_idx_type&, octave_idx_type*, double&, octave_idx_type&, | 125 const octave_idx_type&, double*, double&, octave_idx_type&, |
126 Complex*, const octave_idx_type&, double*, octave_idx_type&); | 126 Complex*, const octave_idx_type&, double*, octave_idx_type&); |
127 | 127 |
128 F77_RET_T | 128 F77_RET_T |
129 F77_FUNC (zpotrf, ZPOTRF) (F77_CONST_CHAR_ARG_DECL, const octave_idx_type&, | 129 F77_FUNC (zpotrf, ZPOTRF) (F77_CONST_CHAR_ARG_DECL, const octave_idx_type&, |
130 Complex*, const octave_idx_type&, | 130 Complex*, const octave_idx_type&, |
2446 for (octave_idx_type i = 0; i < m; i++) | 2446 for (octave_idx_type i = 0; i < m; i++) |
2447 result.elem (i, j) = b.elem (i, j); | 2447 result.elem (i, j) = b.elem (i, j); |
2448 | 2448 |
2449 Complex *presult = result.fortran_vec (); | 2449 Complex *presult = result.fortran_vec (); |
2450 | 2450 |
2451 Array<octave_idx_type> jpvt (n); | 2451 octave_idx_type len_s = m < n ? m : n; |
2452 octave_idx_type *pjpvt = jpvt.fortran_vec (); | 2452 Array<double> s (len_s); |
2453 double *ps = s.fortran_vec (); | |
2453 | 2454 |
2454 double rcond = -1.0; | 2455 double rcond = -1.0; |
2455 | 2456 |
2456 Array<double> rwork (2 * n); | 2457 octave_idx_type lrwork = (5 * (m < n ? m : n)) - 4; |
2458 lrwork = lrwork > 1 ? lrwork : 1; | |
2459 Array<double> rwork (lrwork); | |
2457 double *prwork = rwork.fortran_vec (); | 2460 double *prwork = rwork.fortran_vec (); |
2458 | 2461 |
2459 // Ask ZGELSY what the dimension of WORK should be. | 2462 // Ask ZGELSS what the dimension of WORK should be. |
2460 | 2463 |
2461 octave_idx_type lwork = -1; | 2464 octave_idx_type lwork = -1; |
2462 | 2465 |
2463 Array<Complex> work (1); | 2466 Array<Complex> work (1); |
2464 | 2467 |
2465 F77_XFCN (zgelsy, ZGELSY, (m, n, nrhs, tmp_data, m, presult, | 2468 F77_XFCN (zgelss, ZGELSS, (m, n, nrhs, tmp_data, m, presult, |
2466 nrr, pjpvt, rcond, rank, | 2469 nrr, ps, rcond, rank, |
2467 work.fortran_vec (), lwork, prwork, | 2470 work.fortran_vec (), lwork, prwork, |
2468 info)); | 2471 info)); |
2469 | 2472 |
2470 if (f77_exception_encountered) | 2473 if (f77_exception_encountered) |
2471 (*current_liboctave_error_handler) ("unrecoverable error in zgelsy"); | 2474 (*current_liboctave_error_handler) ("unrecoverable error in zgelss"); |
2472 else | 2475 else |
2473 { | 2476 { |
2474 lwork = static_cast<octave_idx_type> (std::real (work(0))); | 2477 lwork = static_cast<octave_idx_type> (std::real (work(0))); |
2475 work.resize (lwork); | 2478 work.resize (lwork); |
2476 | 2479 |
2477 F77_XFCN (zgelsy, ZGELSY, (m, n, nrhs, tmp_data, m, presult, | 2480 F77_XFCN (zgelss, ZGELSS, (m, n, nrhs, tmp_data, m, presult, |
2478 nrr, pjpvt, rcond, rank, | 2481 nrr, ps, rcond, rank, |
2479 work.fortran_vec (), lwork, | 2482 work.fortran_vec (), lwork, |
2480 prwork, info)); | 2483 prwork, info)); |
2481 | 2484 |
2482 if (f77_exception_encountered) | 2485 if (f77_exception_encountered) |
2483 (*current_liboctave_error_handler) | 2486 (*current_liboctave_error_handler) |
2484 ("unrecoverable error in zgelsy"); | 2487 ("unrecoverable error in zgelss"); |
2485 else | 2488 else |
2486 { | 2489 { |
2487 retval.resize (n, nrhs); | 2490 retval.resize (n, nrhs); |
2488 for (octave_idx_type j = 0; j < nrhs; j++) | 2491 for (octave_idx_type j = 0; j < nrhs; j++) |
2489 for (octave_idx_type i = 0; i < n; i++) | 2492 for (octave_idx_type i = 0; i < n; i++) |
2558 for (octave_idx_type i = 0; i < m; i++) | 2561 for (octave_idx_type i = 0; i < m; i++) |
2559 result.elem (i) = b.elem (i); | 2562 result.elem (i) = b.elem (i); |
2560 | 2563 |
2561 Complex *presult = result.fortran_vec (); | 2564 Complex *presult = result.fortran_vec (); |
2562 | 2565 |
2563 Array<octave_idx_type> jpvt (n); | 2566 octave_idx_type len_s = m < n ? m : n; |
2564 octave_idx_type *pjpvt = jpvt.fortran_vec (); | 2567 Array<double> s (len_s); |
2568 double *ps = s.fortran_vec (); | |
2565 | 2569 |
2566 double rcond = -1.0; | 2570 double rcond = -1.0; |
2567 | 2571 |
2568 Array<double> rwork (2 * n); | 2572 octave_idx_type lrwork = (5 * (m < n ? m : n)) - 4; |
2573 lrwork = lrwork > 1 ? lrwork : 1; | |
2574 Array<double> rwork (lrwork); | |
2569 double *prwork = rwork.fortran_vec (); | 2575 double *prwork = rwork.fortran_vec (); |
2570 | 2576 |
2571 // Ask ZGELSY what the dimension of WORK should be. | 2577 // Ask ZGELSS what the dimension of WORK should be. |
2572 | 2578 |
2573 octave_idx_type lwork = -1; | 2579 octave_idx_type lwork = -1; |
2574 | 2580 |
2575 Array<Complex> work (1); | 2581 Array<Complex> work (1); |
2576 | 2582 |
2577 F77_XFCN (zgelsy, ZGELSY, (m, n, nrhs, tmp_data, m, presult, | 2583 F77_XFCN (zgelss, ZGELSS, (m, n, nrhs, tmp_data, m, presult, |
2578 nrr, pjpvt, rcond, rank, | 2584 nrr, ps, rcond, rank, |
2579 work.fortran_vec (), lwork, prwork, | 2585 work.fortran_vec (), lwork, prwork, |
2580 info)); | 2586 info)); |
2581 | 2587 |
2582 if (f77_exception_encountered) | 2588 if (f77_exception_encountered) |
2583 (*current_liboctave_error_handler) ("unrecoverable error in zgelsy"); | 2589 (*current_liboctave_error_handler) ("unrecoverable error in zgelss"); |
2584 else | 2590 else |
2585 { | 2591 { |
2586 lwork = static_cast<int> (std::real (work(0))); | 2592 lwork = static_cast<int> (std::real (work(0))); |
2587 work.resize (lwork); | 2593 work.resize (lwork); |
2588 | 2594 |
2589 F77_XFCN (zgelsy, ZGELSY, (m, n, nrhs, tmp_data, m, presult, | 2595 F77_XFCN (zgelss, ZGELSS, (m, n, nrhs, tmp_data, m, presult, |
2590 nrr, pjpvt, rcond, rank, | 2596 nrr, ps, rcond, rank, |
2591 work.fortran_vec (), lwork, | 2597 work.fortran_vec (), lwork, |
2592 prwork, info)); | 2598 prwork, info)); |
2593 | 2599 |
2594 if (f77_exception_encountered) | 2600 if (f77_exception_encountered) |
2595 (*current_liboctave_error_handler) | 2601 (*current_liboctave_error_handler) |
2596 ("unrecoverable error in zgelsy"); | 2602 ("unrecoverable error in zgelss"); |
2597 else | 2603 else |
2598 { | 2604 { |
2599 retval.resize (n); | 2605 retval.resize (n); |
2600 for (octave_idx_type i = 0; i < n; i++) | 2606 for (octave_idx_type i = 0; i < n; i++) |
2601 retval.elem (i) = result.elem (i); | 2607 retval.elem (i) = result.elem (i); |