comparison liboctave/dMatrix.cc @ 11570:57632dea2446

attempt better backward compatibility for Array constructors
author John W. Eaton <jwe@octave.org>
date Wed, 19 Jan 2011 17:55:56 -0500
parents fd0a3ac60b0e
children a83bad07f7e3
comparison
equal deleted inserted replaced
11569:7e9a111cae20 11570:57632dea2446
248 : MArray<double> (cv) 248 : MArray<double> (cv)
249 { 249 {
250 } 250 }
251 251
252 Matrix::Matrix (const DiagMatrix& a) 252 Matrix::Matrix (const DiagMatrix& a)
253 : MArray<double> (a.rows (), a.cols (), 0.0) 253 : MArray<double> (a.dims (), 0.0)
254 { 254 {
255 for (octave_idx_type i = 0; i < a.length (); i++) 255 for (octave_idx_type i = 0; i < a.length (); i++)
256 elem (i, i) = a.elem (i, i); 256 elem (i, i) = a.elem (i, i);
257 } 257 }
258 258
259 Matrix::Matrix (const PermMatrix& a) 259 Matrix::Matrix (const PermMatrix& a)
260 : MArray<double> (a.rows (), a.cols (), 0.0) 260 : MArray<double> (a.dims (), 0.0)
261 { 261 {
262 const Array<octave_idx_type> ia (a.pvec ()); 262 const Array<octave_idx_type> ia (a.pvec ());
263 octave_idx_type len = a.rows (); 263 octave_idx_type len = a.rows ();
264 if (a.is_col_perm ()) 264 if (a.is_col_perm ())
265 for (octave_idx_type i = 0; i < len; i++) 265 for (octave_idx_type i = 0; i < len; i++)
276 : MArray<double> (a) 276 : MArray<double> (a)
277 { 277 {
278 } 278 }
279 279
280 Matrix::Matrix (const charMatrix& a) 280 Matrix::Matrix (const charMatrix& a)
281 : MArray<double> (a.rows (), a.cols ()) 281 : MArray<double> (a.dims ())
282 { 282 {
283 for (octave_idx_type i = 0; i < a.rows (); i++) 283 for (octave_idx_type i = 0; i < a.rows (); i++)
284 for (octave_idx_type j = 0; j < a.cols (); j++) 284 for (octave_idx_type j = 0; j < a.cols (); j++)
285 elem (i, j) = static_cast<unsigned char> (a.elem (i, j)); 285 elem (i, j) = static_cast<unsigned char> (a.elem (i, j));
286 } 286 }
738 738
739 if (nr != nc || nr == 0 || nc == 0) 739 if (nr != nc || nr == 0 || nc == 0)
740 (*current_liboctave_error_handler) ("inverse requires square matrix"); 740 (*current_liboctave_error_handler) ("inverse requires square matrix");
741 else 741 else
742 { 742 {
743 Array<octave_idx_type> ipvt (nr, 1); 743 Array<octave_idx_type> ipvt (dim_vector (nr, 1));
744 octave_idx_type *pipvt = ipvt.fortran_vec (); 744 octave_idx_type *pipvt = ipvt.fortran_vec ();
745 745
746 retval = *this; 746 retval = *this;
747 double *tmp_data = retval.fortran_vec (); 747 double *tmp_data = retval.fortran_vec ();
748 748
749 Array<double> z(1, 1); 749 Array<double> z (dim_vector (1, 1));
750 octave_idx_type lwork = -1; 750 octave_idx_type lwork = -1;
751 751
752 // Query the optimum work array size. 752 // Query the optimum work array size.
753 F77_XFCN (dgetri, DGETRI, (nc, tmp_data, nr, pipvt, 753 F77_XFCN (dgetri, DGETRI, (nc, tmp_data, nr, pipvt,
754 z.fortran_vec (), lwork, info)); 754 z.fortran_vec (), lwork, info));
775 { 775 {
776 octave_idx_type dgecon_info = 0; 776 octave_idx_type dgecon_info = 0;
777 777
778 // Now calculate the condition number for non-singular matrix. 778 // Now calculate the condition number for non-singular matrix.
779 char job = '1'; 779 char job = '1';
780 Array<octave_idx_type> iz (nc, 1); 780 Array<octave_idx_type> iz (dim_vector (nc, 1));
781 octave_idx_type *piz = iz.fortran_vec (); 781 octave_idx_type *piz = iz.fortran_vec ();
782 F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1), 782 F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
783 nc, tmp_data, nr, anorm, 783 nc, tmp_data, nr, anorm,
784 rcon, pz, piz, dgecon_info 784 rcon, pz, piz, dgecon_info
785 F77_CHAR_ARG_LEN (1))); 785 F77_CHAR_ARG_LEN (1)));
1010 nsamples = nc; 1010 nsamples = nc;
1011 } 1011 }
1012 1012
1013 octave_idx_type nn = 4*npts+15; 1013 octave_idx_type nn = 4*npts+15;
1014 1014
1015 Array<Complex> wsave (nn, 1); 1015 Array<Complex> wsave (dim_vector (nn, 1));
1016 Complex *pwsave = wsave.fortran_vec (); 1016 Complex *pwsave = wsave.fortran_vec ();
1017 1017
1018 retval = ComplexMatrix (*this); 1018 retval = ComplexMatrix (*this);
1019 Complex *tmp_data = retval.fortran_vec (); 1019 Complex *tmp_data = retval.fortran_vec ();
1020 1020
1051 nsamples = nc; 1051 nsamples = nc;
1052 } 1052 }
1053 1053
1054 octave_idx_type nn = 4*npts+15; 1054 octave_idx_type nn = 4*npts+15;
1055 1055
1056 Array<Complex> wsave (nn, 1); 1056 Array<Complex> wsave (dim_vector (nn, 1));
1057 Complex *pwsave = wsave.fortran_vec (); 1057 Complex *pwsave = wsave.fortran_vec ();
1058 1058
1059 retval = ComplexMatrix (*this); 1059 retval = ComplexMatrix (*this);
1060 Complex *tmp_data = retval.fortran_vec (); 1060 Complex *tmp_data = retval.fortran_vec ();
1061 1061
1095 nsamples = nc; 1095 nsamples = nc;
1096 } 1096 }
1097 1097
1098 octave_idx_type nn = 4*npts+15; 1098 octave_idx_type nn = 4*npts+15;
1099 1099
1100 Array<Complex> wsave (nn, 1); 1100 Array<Complex> wsave (dim_vector (nn, 1));
1101 Complex *pwsave = wsave.fortran_vec (); 1101 Complex *pwsave = wsave.fortran_vec ();
1102 1102
1103 retval = ComplexMatrix (*this); 1103 retval = ComplexMatrix (*this);
1104 Complex *tmp_data = retval.fortran_vec (); 1104 Complex *tmp_data = retval.fortran_vec ();
1105 1105
1117 nn = 4*npts+15; 1117 nn = 4*npts+15;
1118 1118
1119 wsave.resize (nn, 1); 1119 wsave.resize (nn, 1);
1120 pwsave = wsave.fortran_vec (); 1120 pwsave = wsave.fortran_vec ();
1121 1121
1122 Array<Complex> tmp (npts, 1); 1122 Array<Complex> tmp (dim_vector (npts, 1));
1123 Complex *prow = tmp.fortran_vec (); 1123 Complex *prow = tmp.fortran_vec ();
1124 1124
1125 F77_FUNC (zffti, ZFFTI) (npts, pwsave); 1125 F77_FUNC (zffti, ZFFTI) (npts, pwsave);
1126 1126
1127 for (octave_idx_type j = 0; j < nsamples; j++) 1127 for (octave_idx_type j = 0; j < nsamples; j++)
1161 nsamples = nc; 1161 nsamples = nc;
1162 } 1162 }
1163 1163
1164 octave_idx_type nn = 4*npts+15; 1164 octave_idx_type nn = 4*npts+15;
1165 1165
1166 Array<Complex> wsave (nn, 1); 1166 Array<Complex> wsave (dim_vector (nn, 1));
1167 Complex *pwsave = wsave.fortran_vec (); 1167 Complex *pwsave = wsave.fortran_vec ();
1168 1168
1169 retval = ComplexMatrix (*this); 1169 retval = ComplexMatrix (*this);
1170 Complex *tmp_data = retval.fortran_vec (); 1170 Complex *tmp_data = retval.fortran_vec ();
1171 1171
1186 nn = 4*npts+15; 1186 nn = 4*npts+15;
1187 1187
1188 wsave.resize (nn, 1); 1188 wsave.resize (nn, 1);
1189 pwsave = wsave.fortran_vec (); 1189 pwsave = wsave.fortran_vec ();
1190 1190
1191 Array<Complex> tmp (npts, 1); 1191 Array<Complex> tmp (dim_vector (npts, 1));
1192 Complex *prow = tmp.fortran_vec (); 1192 Complex *prow = tmp.fortran_vec ();
1193 1193
1194 F77_FUNC (zffti, ZFFTI) (npts, pwsave); 1194 F77_FUNC (zffti, ZFFTI) (npts, pwsave);
1195 1195
1196 for (octave_idx_type j = 0; j < nsamples; j++) 1196 for (octave_idx_type j = 0; j < nsamples; j++)
1283 mattype.mark_as_unsymmetric (); 1283 mattype.mark_as_unsymmetric ();
1284 typ = MatrixType::Full; 1284 typ = MatrixType::Full;
1285 } 1285 }
1286 else 1286 else
1287 { 1287 {
1288 Array<double> z (3 * nc, 1); 1288 Array<double> z (dim_vector (3 * nc, 1));
1289 double *pz = z.fortran_vec (); 1289 double *pz = z.fortran_vec ();
1290 Array<octave_idx_type> iz (nc, 1); 1290 Array<octave_idx_type> iz (dim_vector (nc, 1));
1291 octave_idx_type *piz = iz.fortran_vec (); 1291 octave_idx_type *piz = iz.fortran_vec ();
1292 1292
1293 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1), 1293 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
1294 nr, tmp_data, nr, anorm, 1294 nr, tmp_data, nr, anorm,
1295 rcon, pz, piz, info 1295 rcon, pz, piz, info
1307 else if (typ != MatrixType::Full) 1307 else if (typ != MatrixType::Full)
1308 (*current_liboctave_error_handler) ("det: invalid dense matrix type"); 1308 (*current_liboctave_error_handler) ("det: invalid dense matrix type");
1309 1309
1310 if (typ == MatrixType::Full) 1310 if (typ == MatrixType::Full)
1311 { 1311 {
1312 Array<octave_idx_type> ipvt (nr, 1); 1312 Array<octave_idx_type> ipvt (dim_vector (nr, 1));
1313 octave_idx_type *pipvt = ipvt.fortran_vec (); 1313 octave_idx_type *pipvt = ipvt.fortran_vec ();
1314 1314
1315 Matrix atmp = *this; 1315 Matrix atmp = *this;
1316 double *tmp_data = atmp.fortran_vec (); 1316 double *tmp_data = atmp.fortran_vec ();
1317 1317
1334 { 1334 {
1335 if (calc_cond) 1335 if (calc_cond)
1336 { 1336 {
1337 // Now calc the condition number for non-singular matrix. 1337 // Now calc the condition number for non-singular matrix.
1338 char job = '1'; 1338 char job = '1';
1339 Array<double> z (4 * nc, 1); 1339 Array<double> z (dim_vector (4 * nc, 1));
1340 double *pz = z.fortran_vec (); 1340 double *pz = z.fortran_vec ();
1341 Array<octave_idx_type> iz (nc, 1); 1341 Array<octave_idx_type> iz (dim_vector (nc, 1));
1342 octave_idx_type *piz = iz.fortran_vec (); 1342 octave_idx_type *piz = iz.fortran_vec ();
1343 1343
1344 F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1), 1344 F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
1345 nc, tmp_data, nr, anorm, 1345 nc, tmp_data, nr, anorm,
1346 rcon, pz, piz, info 1346 rcon, pz, piz, info
1399 octave_idx_type info = 0; 1399 octave_idx_type info = 0;
1400 char norm = '1'; 1400 char norm = '1';
1401 char uplo = 'U'; 1401 char uplo = 'U';
1402 char dia = 'N'; 1402 char dia = 'N';
1403 1403
1404 Array<double> z (3 * nc, 1); 1404 Array<double> z (dim_vector (3 * nc, 1));
1405 double *pz = z.fortran_vec (); 1405 double *pz = z.fortran_vec ();
1406 Array<octave_idx_type> iz (nc, 1); 1406 Array<octave_idx_type> iz (dim_vector (nc, 1));
1407 octave_idx_type *piz = iz.fortran_vec (); 1407 octave_idx_type *piz = iz.fortran_vec ();
1408 1408
1409 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 1409 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1),
1410 F77_CONST_CHAR_ARG2 (&uplo, 1), 1410 F77_CONST_CHAR_ARG2 (&uplo, 1),
1411 F77_CONST_CHAR_ARG2 (&dia, 1), 1411 F77_CONST_CHAR_ARG2 (&dia, 1),
1427 octave_idx_type info = 0; 1427 octave_idx_type info = 0;
1428 char norm = '1'; 1428 char norm = '1';
1429 char uplo = 'L'; 1429 char uplo = 'L';
1430 char dia = 'N'; 1430 char dia = 'N';
1431 1431
1432 Array<double> z (3 * nc, 1); 1432 Array<double> z (dim_vector (3 * nc, 1));
1433 double *pz = z.fortran_vec (); 1433 double *pz = z.fortran_vec ();
1434 Array<octave_idx_type> iz (nc, 1); 1434 Array<octave_idx_type> iz (dim_vector (nc, 1));
1435 octave_idx_type *piz = iz.fortran_vec (); 1435 octave_idx_type *piz = iz.fortran_vec ();
1436 1436
1437 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 1437 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1),
1438 F77_CONST_CHAR_ARG2 (&uplo, 1), 1438 F77_CONST_CHAR_ARG2 (&uplo, 1),
1439 F77_CONST_CHAR_ARG2 (&dia, 1), 1439 F77_CONST_CHAR_ARG2 (&dia, 1),
1472 mattype.mark_as_unsymmetric (); 1472 mattype.mark_as_unsymmetric ();
1473 typ = MatrixType::Full; 1473 typ = MatrixType::Full;
1474 } 1474 }
1475 else 1475 else
1476 { 1476 {
1477 Array<double> z (3 * nc, 1); 1477 Array<double> z (dim_vector (3 * nc, 1));
1478 double *pz = z.fortran_vec (); 1478 double *pz = z.fortran_vec ();
1479 Array<octave_idx_type> iz (nc, 1); 1479 Array<octave_idx_type> iz (dim_vector (nc, 1));
1480 octave_idx_type *piz = iz.fortran_vec (); 1480 octave_idx_type *piz = iz.fortran_vec ();
1481 1481
1482 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1), 1482 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
1483 nr, tmp_data, nr, anorm, 1483 nr, tmp_data, nr, anorm,
1484 rcon, pz, piz, info 1484 rcon, pz, piz, info
1491 1491
1492 if (typ == MatrixType::Full) 1492 if (typ == MatrixType::Full)
1493 { 1493 {
1494 octave_idx_type info = 0; 1494 octave_idx_type info = 0;
1495 1495
1496 Array<octave_idx_type> ipvt (nr, 1); 1496 Array<octave_idx_type> ipvt (dim_vector (nr, 1));
1497 octave_idx_type *pipvt = ipvt.fortran_vec (); 1497 octave_idx_type *pipvt = ipvt.fortran_vec ();
1498 1498
1499 if(anorm < 0.) 1499 if(anorm < 0.)
1500 anorm = atmp.abs().sum(). 1500 anorm = atmp.abs().sum().
1501 row(static_cast<octave_idx_type>(0)).max(); 1501 row(static_cast<octave_idx_type>(0)).max();
1502 1502
1503 Array<double> z (4 * nc, 1); 1503 Array<double> z (dim_vector (4 * nc, 1));
1504 double *pz = z.fortran_vec (); 1504 double *pz = z.fortran_vec ();
1505 Array<octave_idx_type> iz (nc, 1); 1505 Array<octave_idx_type> iz (dim_vector (nc, 1));
1506 octave_idx_type *piz = iz.fortran_vec (); 1506 octave_idx_type *piz = iz.fortran_vec ();
1507 1507
1508 F77_XFCN (dgetrf, DGETRF, (nr, nr, tmp_data, nr, pipvt, info)); 1508 F77_XFCN (dgetrf, DGETRF, (nr, nr, tmp_data, nr, pipvt, info));
1509 1509
1510 if (info != 0) 1510 if (info != 0)
1571 { 1571 {
1572 char norm = '1'; 1572 char norm = '1';
1573 char uplo = 'U'; 1573 char uplo = 'U';
1574 char dia = 'N'; 1574 char dia = 'N';
1575 1575
1576 Array<double> z (3 * nc, 1); 1576 Array<double> z (dim_vector (3 * nc, 1));
1577 double *pz = z.fortran_vec (); 1577 double *pz = z.fortran_vec ();
1578 Array<octave_idx_type> iz (nc, 1); 1578 Array<octave_idx_type> iz (dim_vector (nc, 1));
1579 octave_idx_type *piz = iz.fortran_vec (); 1579 octave_idx_type *piz = iz.fortran_vec ();
1580 1580
1581 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 1581 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1),
1582 F77_CONST_CHAR_ARG2 (&uplo, 1), 1582 F77_CONST_CHAR_ARG2 (&uplo, 1),
1583 F77_CONST_CHAR_ARG2 (&dia, 1), 1583 F77_CONST_CHAR_ARG2 (&dia, 1),
1671 { 1671 {
1672 char norm = '1'; 1672 char norm = '1';
1673 char uplo = 'L'; 1673 char uplo = 'L';
1674 char dia = 'N'; 1674 char dia = 'N';
1675 1675
1676 Array<double> z (3 * nc, 1); 1676 Array<double> z (dim_vector (3 * nc, 1));
1677 double *pz = z.fortran_vec (); 1677 double *pz = z.fortran_vec ();
1678 Array<octave_idx_type> iz (nc, 1); 1678 Array<octave_idx_type> iz (dim_vector (nc, 1));
1679 octave_idx_type *piz = iz.fortran_vec (); 1679 octave_idx_type *piz = iz.fortran_vec ();
1680 1680
1681 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 1681 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1),
1682 F77_CONST_CHAR_ARG2 (&uplo, 1), 1682 F77_CONST_CHAR_ARG2 (&uplo, 1),
1683 F77_CONST_CHAR_ARG2 (&dia, 1), 1683 F77_CONST_CHAR_ARG2 (&dia, 1),
1777 } 1777 }
1778 else 1778 else
1779 { 1779 {
1780 if (calc_cond) 1780 if (calc_cond)
1781 { 1781 {
1782 Array<double> z (3 * nc, 1); 1782 Array<double> z (dim_vector (3 * nc, 1));
1783 double *pz = z.fortran_vec (); 1783 double *pz = z.fortran_vec ();
1784 Array<octave_idx_type> iz (nc, 1); 1784 Array<octave_idx_type> iz (dim_vector (nc, 1));
1785 octave_idx_type *piz = iz.fortran_vec (); 1785 octave_idx_type *piz = iz.fortran_vec ();
1786 1786
1787 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1), 1787 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
1788 nr, tmp_data, nr, anorm, 1788 nr, tmp_data, nr, anorm,
1789 rcon, pz, piz, info 1789 rcon, pz, piz, info
1829 1829
1830 if (typ == MatrixType::Full) 1830 if (typ == MatrixType::Full)
1831 { 1831 {
1832 info = 0; 1832 info = 0;
1833 1833
1834 Array<octave_idx_type> ipvt (nr, 1); 1834 Array<octave_idx_type> ipvt (dim_vector (nr, 1));
1835 octave_idx_type *pipvt = ipvt.fortran_vec (); 1835 octave_idx_type *pipvt = ipvt.fortran_vec ();
1836 1836
1837 Matrix atmp = *this; 1837 Matrix atmp = *this;
1838 double *tmp_data = atmp.fortran_vec (); 1838 double *tmp_data = atmp.fortran_vec ();
1839 if(anorm < 0.) 1839 if(anorm < 0.)
1840 anorm = atmp.abs().sum().row(static_cast<octave_idx_type>(0)).max(); 1840 anorm = atmp.abs().sum().row(static_cast<octave_idx_type>(0)).max();
1841 1841
1842 Array<double> z (4 * nc, 1); 1842 Array<double> z (dim_vector (4 * nc, 1));
1843 double *pz = z.fortran_vec (); 1843 double *pz = z.fortran_vec ();
1844 Array<octave_idx_type> iz (nc, 1); 1844 Array<octave_idx_type> iz (dim_vector (nc, 1));
1845 octave_idx_type *piz = iz.fortran_vec (); 1845 octave_idx_type *piz = iz.fortran_vec ();
1846 1846
1847 F77_XFCN (dgetrf, DGETRF, (nr, nr, tmp_data, nr, pipvt, info)); 1847 F77_XFCN (dgetrf, DGETRF, (nr, nr, tmp_data, nr, pipvt, info));
1848 1848
1849 // Throw-away extra info LAPACK gives so as to not change output. 1849 // Throw-away extra info LAPACK gives so as to not change output.
2269 2269
2270 Matrix atmp = *this; 2270 Matrix atmp = *this;
2271 double *tmp_data = atmp.fortran_vec (); 2271 double *tmp_data = atmp.fortran_vec ();
2272 2272
2273 double *pretval = retval.fortran_vec (); 2273 double *pretval = retval.fortran_vec ();
2274 Array<double> s (minmn, 1); 2274 Array<double> s (dim_vector (minmn, 1));
2275 double *ps = s.fortran_vec (); 2275 double *ps = s.fortran_vec ();
2276 2276
2277 // Ask DGELSD what the dimension of WORK should be. 2277 // Ask DGELSD what the dimension of WORK should be.
2278 octave_idx_type lwork = -1; 2278 octave_idx_type lwork = -1;
2279 2279
2280 Array<double> work (1, 1); 2280 Array<double> work (dim_vector (1, 1));
2281 2281
2282 octave_idx_type smlsiz; 2282 octave_idx_type smlsiz;
2283 F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("DGELSD", 6), 2283 F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("DGELSD", 6),
2284 F77_CONST_CHAR_ARG2 (" ", 1), 2284 F77_CONST_CHAR_ARG2 (" ", 1),
2285 0, 0, 0, 0, smlsiz 2285 0, 0, 0, 0, smlsiz
2307 nlvl = 0; 2307 nlvl = 0;
2308 2308
2309 octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn; 2309 octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn;
2310 if (liwork < 1) 2310 if (liwork < 1)
2311 liwork = 1; 2311 liwork = 1;
2312 Array<octave_idx_type> iwork (liwork, 1); 2312 Array<octave_idx_type> iwork (dim_vector (liwork, 1));
2313 octave_idx_type* piwork = iwork.fortran_vec (); 2313 octave_idx_type* piwork = iwork.fortran_vec ();
2314 2314
2315 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn, 2315 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
2316 ps, rcon, rank, work.fortran_vec (), 2316 ps, rcon, rank, work.fortran_vec (),
2317 lwork, piwork, info)); 2317 lwork, piwork, info));
2467 2467
2468 Matrix atmp = *this; 2468 Matrix atmp = *this;
2469 double *tmp_data = atmp.fortran_vec (); 2469 double *tmp_data = atmp.fortran_vec ();
2470 2470
2471 double *pretval = retval.fortran_vec (); 2471 double *pretval = retval.fortran_vec ();
2472 Array<double> s (minmn, 1); 2472 Array<double> s (dim_vector (minmn, 1));
2473 double *ps = s.fortran_vec (); 2473 double *ps = s.fortran_vec ();
2474 2474
2475 // Ask DGELSD what the dimension of WORK should be. 2475 // Ask DGELSD what the dimension of WORK should be.
2476 octave_idx_type lwork = -1; 2476 octave_idx_type lwork = -1;
2477 2477
2478 Array<double> work (1, 1); 2478 Array<double> work (dim_vector (1, 1));
2479 2479
2480 octave_idx_type smlsiz; 2480 octave_idx_type smlsiz;
2481 F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("DGELSD", 6), 2481 F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("DGELSD", 6),
2482 F77_CONST_CHAR_ARG2 (" ", 1), 2482 F77_CONST_CHAR_ARG2 (" ", 1),
2483 0, 0, 0, 0, smlsiz 2483 0, 0, 0, 0, smlsiz
2498 nlvl = 0; 2498 nlvl = 0;
2499 2499
2500 octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn; 2500 octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn;
2501 if (liwork < 1) 2501 if (liwork < 1)
2502 liwork = 1; 2502 liwork = 1;
2503 Array<octave_idx_type> iwork (liwork, 1); 2503 Array<octave_idx_type> iwork (dim_vector (liwork, 1));
2504 octave_idx_type* piwork = iwork.fortran_vec (); 2504 octave_idx_type* piwork = iwork.fortran_vec ();
2505 2505
2506 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn, 2506 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
2507 ps, rcon, rank, work.fortran_vec (), 2507 ps, rcon, rank, work.fortran_vec (),
2508 lwork, piwork, info)); 2508 lwork, piwork, info));