Mercurial > hg > octave-lyh
comparison liboctave/dMatrix.cc @ 10350:12884915a8e4
merge MArray classes & improve Array interface
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Sat, 23 Jan 2010 21:41:03 +0100 |
parents | 07ebe522dac2 |
children | a3635bc1ea19 |
comparison
equal
deleted
inserted
replaced
10349:d4d13389c957 | 10350:12884915a8e4 |
---|---|
212 } | 212 } |
213 | 213 |
214 // Matrix class. | 214 // Matrix class. |
215 | 215 |
216 Matrix::Matrix (const RowVector& rv) | 216 Matrix::Matrix (const RowVector& rv) |
217 : MArray2<double> (Array2<double> (rv, 1, rv.length ())) | 217 : MArray<double> (rv) |
218 { | 218 { |
219 } | 219 } |
220 | 220 |
221 Matrix::Matrix (const ColumnVector& cv) | 221 Matrix::Matrix (const ColumnVector& cv) |
222 : MArray2<double> (Array2<double> (cv, cv.length (), 1)) | 222 : MArray<double> (cv) |
223 { | 223 { |
224 } | 224 } |
225 | 225 |
226 Matrix::Matrix (const DiagMatrix& a) | 226 Matrix::Matrix (const DiagMatrix& a) |
227 : MArray2<double> (a.rows (), a.cols (), 0.0) | 227 : MArray<double> (a.rows (), a.cols (), 0.0) |
228 { | 228 { |
229 for (octave_idx_type i = 0; i < a.length (); i++) | 229 for (octave_idx_type i = 0; i < a.length (); i++) |
230 elem (i, i) = a.elem (i, i); | 230 elem (i, i) = a.elem (i, i); |
231 } | 231 } |
232 | 232 |
233 Matrix::Matrix (const PermMatrix& a) | 233 Matrix::Matrix (const PermMatrix& a) |
234 : MArray2<double> (a.rows (), a.cols (), 0.0) | 234 : MArray<double> (a.rows (), a.cols (), 0.0) |
235 { | 235 { |
236 const Array<octave_idx_type> ia (a.pvec ()); | 236 const Array<octave_idx_type> ia (a.pvec ()); |
237 octave_idx_type len = a.rows (); | 237 octave_idx_type len = a.rows (); |
238 if (a.is_col_perm ()) | 238 if (a.is_col_perm ()) |
239 for (octave_idx_type i = 0; i < len; i++) | 239 for (octave_idx_type i = 0; i < len; i++) |
245 | 245 |
246 // FIXME -- could we use a templated mixed-type copy function | 246 // FIXME -- could we use a templated mixed-type copy function |
247 // here? | 247 // here? |
248 | 248 |
249 Matrix::Matrix (const boolMatrix& a) | 249 Matrix::Matrix (const boolMatrix& a) |
250 : MArray2<double> (a.rows (), a.cols ()) | 250 : MArray<double> (a) |
251 { | 251 { |
252 for (octave_idx_type i = 0; i < a.rows (); i++) | |
253 for (octave_idx_type j = 0; j < a.cols (); j++) | |
254 elem (i, j) = a.elem (i, j); | |
255 } | 252 } |
256 | 253 |
257 Matrix::Matrix (const charMatrix& a) | 254 Matrix::Matrix (const charMatrix& a) |
258 : MArray2<double> (a.rows (), a.cols ()) | 255 : MArray<double> (a.rows (), a.cols ()) |
259 { | 256 { |
260 for (octave_idx_type i = 0; i < a.rows (); i++) | 257 for (octave_idx_type i = 0; i < a.rows (); i++) |
261 for (octave_idx_type j = 0; j < a.cols (); j++) | 258 for (octave_idx_type j = 0; j < a.cols (); j++) |
262 elem (i, j) = static_cast<unsigned char> (a.elem (i, j)); | 259 elem (i, j) = static_cast<unsigned char> (a.elem (i, j)); |
263 } | 260 } |
294 } | 291 } |
295 | 292 |
296 Matrix& | 293 Matrix& |
297 Matrix::insert (const Matrix& a, octave_idx_type r, octave_idx_type c) | 294 Matrix::insert (const Matrix& a, octave_idx_type r, octave_idx_type c) |
298 { | 295 { |
299 Array2<double>::insert (a, r, c); | 296 Array<double>::insert (a, r, c); |
300 return *this; | 297 return *this; |
301 } | 298 } |
302 | 299 |
303 Matrix& | 300 Matrix& |
304 Matrix::insert (const RowVector& a, octave_idx_type r, octave_idx_type c) | 301 Matrix::insert (const RowVector& a, octave_idx_type r, octave_idx_type c) |
612 // extract row or column i. | 609 // extract row or column i. |
613 | 610 |
614 RowVector | 611 RowVector |
615 Matrix::row (octave_idx_type i) const | 612 Matrix::row (octave_idx_type i) const |
616 { | 613 { |
617 return MArray<double> (index (idx_vector (i), idx_vector::colon)); | 614 return index (idx_vector (i), idx_vector::colon); |
618 } | 615 } |
619 | 616 |
620 ColumnVector | 617 ColumnVector |
621 Matrix::column (octave_idx_type i) const | 618 Matrix::column (octave_idx_type i) const |
622 { | 619 { |
623 return MArray<double> (index (idx_vector::colon, idx_vector (i))); | 620 return index (idx_vector::colon, idx_vector (i)); |
624 } | 621 } |
625 | 622 |
626 Matrix | 623 Matrix |
627 Matrix::inverse (void) const | 624 Matrix::inverse (void) const |
628 { | 625 { |
732 | 729 |
733 if (nr != nc || nr == 0 || nc == 0) | 730 if (nr != nc || nr == 0 || nc == 0) |
734 (*current_liboctave_error_handler) ("inverse requires square matrix"); | 731 (*current_liboctave_error_handler) ("inverse requires square matrix"); |
735 else | 732 else |
736 { | 733 { |
737 Array<octave_idx_type> ipvt (nr); | 734 Array<octave_idx_type> ipvt (nr, 1); |
738 octave_idx_type *pipvt = ipvt.fortran_vec (); | 735 octave_idx_type *pipvt = ipvt.fortran_vec (); |
739 | 736 |
740 retval = *this; | 737 retval = *this; |
741 double *tmp_data = retval.fortran_vec (); | 738 double *tmp_data = retval.fortran_vec (); |
742 | 739 |
743 Array<double> z(1); | 740 Array<double> z(1, 1); |
744 octave_idx_type lwork = -1; | 741 octave_idx_type lwork = -1; |
745 | 742 |
746 // Query the optimum work array size. | 743 // Query the optimum work array size. |
747 F77_XFCN (dgetri, DGETRI, (nc, tmp_data, nr, pipvt, | 744 F77_XFCN (dgetri, DGETRI, (nc, tmp_data, nr, pipvt, |
748 z.fortran_vec (), lwork, info)); | 745 z.fortran_vec (), lwork, info)); |
749 | 746 |
750 lwork = static_cast<octave_idx_type> (z(0)); | 747 lwork = static_cast<octave_idx_type> (z(0)); |
751 lwork = (lwork < 2 *nc ? 2*nc : lwork); | 748 lwork = (lwork < 2 *nc ? 2*nc : lwork); |
752 z.resize (lwork); | 749 z.resize (lwork, 1); |
753 double *pz = z.fortran_vec (); | 750 double *pz = z.fortran_vec (); |
754 | 751 |
755 info = 0; | 752 info = 0; |
756 | 753 |
757 // Calculate the norm of the matrix, for later use. | 754 // Calculate the norm of the matrix, for later use. |
769 { | 766 { |
770 octave_idx_type dgecon_info = 0; | 767 octave_idx_type dgecon_info = 0; |
771 | 768 |
772 // Now calculate the condition number for non-singular matrix. | 769 // Now calculate the condition number for non-singular matrix. |
773 char job = '1'; | 770 char job = '1'; |
774 Array<octave_idx_type> iz (nc); | 771 Array<octave_idx_type> iz (nc, 1); |
775 octave_idx_type *piz = iz.fortran_vec (); | 772 octave_idx_type *piz = iz.fortran_vec (); |
776 F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1), | 773 F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1), |
777 nc, tmp_data, nr, anorm, | 774 nc, tmp_data, nr, anorm, |
778 rcon, pz, piz, dgecon_info | 775 rcon, pz, piz, dgecon_info |
779 F77_CHAR_ARG_LEN (1))); | 776 F77_CHAR_ARG_LEN (1))); |
1004 nsamples = nc; | 1001 nsamples = nc; |
1005 } | 1002 } |
1006 | 1003 |
1007 octave_idx_type nn = 4*npts+15; | 1004 octave_idx_type nn = 4*npts+15; |
1008 | 1005 |
1009 Array<Complex> wsave (nn); | 1006 Array<Complex> wsave (nn, 1); |
1010 Complex *pwsave = wsave.fortran_vec (); | 1007 Complex *pwsave = wsave.fortran_vec (); |
1011 | 1008 |
1012 retval = ComplexMatrix (*this); | 1009 retval = ComplexMatrix (*this); |
1013 Complex *tmp_data = retval.fortran_vec (); | 1010 Complex *tmp_data = retval.fortran_vec (); |
1014 | 1011 |
1045 nsamples = nc; | 1042 nsamples = nc; |
1046 } | 1043 } |
1047 | 1044 |
1048 octave_idx_type nn = 4*npts+15; | 1045 octave_idx_type nn = 4*npts+15; |
1049 | 1046 |
1050 Array<Complex> wsave (nn); | 1047 Array<Complex> wsave (nn, 1); |
1051 Complex *pwsave = wsave.fortran_vec (); | 1048 Complex *pwsave = wsave.fortran_vec (); |
1052 | 1049 |
1053 retval = ComplexMatrix (*this); | 1050 retval = ComplexMatrix (*this); |
1054 Complex *tmp_data = retval.fortran_vec (); | 1051 Complex *tmp_data = retval.fortran_vec (); |
1055 | 1052 |
1089 nsamples = nc; | 1086 nsamples = nc; |
1090 } | 1087 } |
1091 | 1088 |
1092 octave_idx_type nn = 4*npts+15; | 1089 octave_idx_type nn = 4*npts+15; |
1093 | 1090 |
1094 Array<Complex> wsave (nn); | 1091 Array<Complex> wsave (nn, 1); |
1095 Complex *pwsave = wsave.fortran_vec (); | 1092 Complex *pwsave = wsave.fortran_vec (); |
1096 | 1093 |
1097 retval = ComplexMatrix (*this); | 1094 retval = ComplexMatrix (*this); |
1098 Complex *tmp_data = retval.fortran_vec (); | 1095 Complex *tmp_data = retval.fortran_vec (); |
1099 | 1096 |
1108 | 1105 |
1109 npts = nc; | 1106 npts = nc; |
1110 nsamples = nr; | 1107 nsamples = nr; |
1111 nn = 4*npts+15; | 1108 nn = 4*npts+15; |
1112 | 1109 |
1113 wsave.resize (nn); | 1110 wsave.resize (nn, 1); |
1114 pwsave = wsave.fortran_vec (); | 1111 pwsave = wsave.fortran_vec (); |
1115 | 1112 |
1116 Array<Complex> tmp (npts); | 1113 Array<Complex> tmp (npts, 1); |
1117 Complex *prow = tmp.fortran_vec (); | 1114 Complex *prow = tmp.fortran_vec (); |
1118 | 1115 |
1119 F77_FUNC (zffti, ZFFTI) (npts, pwsave); | 1116 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
1120 | 1117 |
1121 for (octave_idx_type j = 0; j < nsamples; j++) | 1118 for (octave_idx_type j = 0; j < nsamples; j++) |
1155 nsamples = nc; | 1152 nsamples = nc; |
1156 } | 1153 } |
1157 | 1154 |
1158 octave_idx_type nn = 4*npts+15; | 1155 octave_idx_type nn = 4*npts+15; |
1159 | 1156 |
1160 Array<Complex> wsave (nn); | 1157 Array<Complex> wsave (nn, 1); |
1161 Complex *pwsave = wsave.fortran_vec (); | 1158 Complex *pwsave = wsave.fortran_vec (); |
1162 | 1159 |
1163 retval = ComplexMatrix (*this); | 1160 retval = ComplexMatrix (*this); |
1164 Complex *tmp_data = retval.fortran_vec (); | 1161 Complex *tmp_data = retval.fortran_vec (); |
1165 | 1162 |
1177 | 1174 |
1178 npts = nc; | 1175 npts = nc; |
1179 nsamples = nr; | 1176 nsamples = nr; |
1180 nn = 4*npts+15; | 1177 nn = 4*npts+15; |
1181 | 1178 |
1182 wsave.resize (nn); | 1179 wsave.resize (nn, 1); |
1183 pwsave = wsave.fortran_vec (); | 1180 pwsave = wsave.fortran_vec (); |
1184 | 1181 |
1185 Array<Complex> tmp (npts); | 1182 Array<Complex> tmp (npts, 1); |
1186 Complex *prow = tmp.fortran_vec (); | 1183 Complex *prow = tmp.fortran_vec (); |
1187 | 1184 |
1188 F77_FUNC (zffti, ZFFTI) (npts, pwsave); | 1185 F77_FUNC (zffti, ZFFTI) (npts, pwsave); |
1189 | 1186 |
1190 for (octave_idx_type j = 0; j < nsamples; j++) | 1187 for (octave_idx_type j = 0; j < nsamples; j++) |
1277 mattype.mark_as_unsymmetric (); | 1274 mattype.mark_as_unsymmetric (); |
1278 typ = MatrixType::Full; | 1275 typ = MatrixType::Full; |
1279 } | 1276 } |
1280 else | 1277 else |
1281 { | 1278 { |
1282 Array<double> z (3 * nc); | 1279 Array<double> z (3 * nc, 1); |
1283 double *pz = z.fortran_vec (); | 1280 double *pz = z.fortran_vec (); |
1284 Array<octave_idx_type> iz (nc); | 1281 Array<octave_idx_type> iz (nc, 1); |
1285 octave_idx_type *piz = iz.fortran_vec (); | 1282 octave_idx_type *piz = iz.fortran_vec (); |
1286 | 1283 |
1287 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1), | 1284 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1), |
1288 nr, tmp_data, nr, anorm, | 1285 nr, tmp_data, nr, anorm, |
1289 rcon, pz, piz, info | 1286 rcon, pz, piz, info |
1301 else if (typ != MatrixType::Full) | 1298 else if (typ != MatrixType::Full) |
1302 (*current_liboctave_error_handler) ("det: invalid dense matrix type"); | 1299 (*current_liboctave_error_handler) ("det: invalid dense matrix type"); |
1303 | 1300 |
1304 if (typ == MatrixType::Full) | 1301 if (typ == MatrixType::Full) |
1305 { | 1302 { |
1306 Array<octave_idx_type> ipvt (nr); | 1303 Array<octave_idx_type> ipvt (nr, 1); |
1307 octave_idx_type *pipvt = ipvt.fortran_vec (); | 1304 octave_idx_type *pipvt = ipvt.fortran_vec (); |
1308 | 1305 |
1309 Matrix atmp = *this; | 1306 Matrix atmp = *this; |
1310 double *tmp_data = atmp.fortran_vec (); | 1307 double *tmp_data = atmp.fortran_vec (); |
1311 | 1308 |
1328 { | 1325 { |
1329 if (calc_cond) | 1326 if (calc_cond) |
1330 { | 1327 { |
1331 // Now calc the condition number for non-singular matrix. | 1328 // Now calc the condition number for non-singular matrix. |
1332 char job = '1'; | 1329 char job = '1'; |
1333 Array<double> z (4 * nc); | 1330 Array<double> z (4 * nc, 1); |
1334 double *pz = z.fortran_vec (); | 1331 double *pz = z.fortran_vec (); |
1335 Array<octave_idx_type> iz (nc); | 1332 Array<octave_idx_type> iz (nc, 1); |
1336 octave_idx_type *piz = iz.fortran_vec (); | 1333 octave_idx_type *piz = iz.fortran_vec (); |
1337 | 1334 |
1338 F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1), | 1335 F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1), |
1339 nc, tmp_data, nr, anorm, | 1336 nc, tmp_data, nr, anorm, |
1340 rcon, pz, piz, info | 1337 rcon, pz, piz, info |
1393 octave_idx_type info = 0; | 1390 octave_idx_type info = 0; |
1394 char norm = '1'; | 1391 char norm = '1'; |
1395 char uplo = 'U'; | 1392 char uplo = 'U'; |
1396 char dia = 'N'; | 1393 char dia = 'N'; |
1397 | 1394 |
1398 Array<double> z (3 * nc); | 1395 Array<double> z (3 * nc, 1); |
1399 double *pz = z.fortran_vec (); | 1396 double *pz = z.fortran_vec (); |
1400 Array<octave_idx_type> iz (nc); | 1397 Array<octave_idx_type> iz (nc, 1); |
1401 octave_idx_type *piz = iz.fortran_vec (); | 1398 octave_idx_type *piz = iz.fortran_vec (); |
1402 | 1399 |
1403 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), | 1400 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), |
1404 F77_CONST_CHAR_ARG2 (&uplo, 1), | 1401 F77_CONST_CHAR_ARG2 (&uplo, 1), |
1405 F77_CONST_CHAR_ARG2 (&dia, 1), | 1402 F77_CONST_CHAR_ARG2 (&dia, 1), |
1421 octave_idx_type info = 0; | 1418 octave_idx_type info = 0; |
1422 char norm = '1'; | 1419 char norm = '1'; |
1423 char uplo = 'L'; | 1420 char uplo = 'L'; |
1424 char dia = 'N'; | 1421 char dia = 'N'; |
1425 | 1422 |
1426 Array<double> z (3 * nc); | 1423 Array<double> z (3 * nc, 1); |
1427 double *pz = z.fortran_vec (); | 1424 double *pz = z.fortran_vec (); |
1428 Array<octave_idx_type> iz (nc); | 1425 Array<octave_idx_type> iz (nc, 1); |
1429 octave_idx_type *piz = iz.fortran_vec (); | 1426 octave_idx_type *piz = iz.fortran_vec (); |
1430 | 1427 |
1431 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), | 1428 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), |
1432 F77_CONST_CHAR_ARG2 (&uplo, 1), | 1429 F77_CONST_CHAR_ARG2 (&uplo, 1), |
1433 F77_CONST_CHAR_ARG2 (&dia, 1), | 1430 F77_CONST_CHAR_ARG2 (&dia, 1), |
1466 mattype.mark_as_unsymmetric (); | 1463 mattype.mark_as_unsymmetric (); |
1467 typ = MatrixType::Full; | 1464 typ = MatrixType::Full; |
1468 } | 1465 } |
1469 else | 1466 else |
1470 { | 1467 { |
1471 Array<double> z (3 * nc); | 1468 Array<double> z (3 * nc, 1); |
1472 double *pz = z.fortran_vec (); | 1469 double *pz = z.fortran_vec (); |
1473 Array<octave_idx_type> iz (nc); | 1470 Array<octave_idx_type> iz (nc, 1); |
1474 octave_idx_type *piz = iz.fortran_vec (); | 1471 octave_idx_type *piz = iz.fortran_vec (); |
1475 | 1472 |
1476 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1), | 1473 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1), |
1477 nr, tmp_data, nr, anorm, | 1474 nr, tmp_data, nr, anorm, |
1478 rcon, pz, piz, info | 1475 rcon, pz, piz, info |
1485 | 1482 |
1486 if (typ == MatrixType::Full) | 1483 if (typ == MatrixType::Full) |
1487 { | 1484 { |
1488 octave_idx_type info = 0; | 1485 octave_idx_type info = 0; |
1489 | 1486 |
1490 Array<octave_idx_type> ipvt (nr); | 1487 Array<octave_idx_type> ipvt (nr, 1); |
1491 octave_idx_type *pipvt = ipvt.fortran_vec (); | 1488 octave_idx_type *pipvt = ipvt.fortran_vec (); |
1492 | 1489 |
1493 if(anorm < 0.) | 1490 if(anorm < 0.) |
1494 anorm = atmp.abs().sum(). | 1491 anorm = atmp.abs().sum(). |
1495 row(static_cast<octave_idx_type>(0)).max(); | 1492 row(static_cast<octave_idx_type>(0)).max(); |
1496 | 1493 |
1497 Array<double> z (4 * nc); | 1494 Array<double> z (4 * nc, 1); |
1498 double *pz = z.fortran_vec (); | 1495 double *pz = z.fortran_vec (); |
1499 Array<octave_idx_type> iz (nc); | 1496 Array<octave_idx_type> iz (nc, 1); |
1500 octave_idx_type *piz = iz.fortran_vec (); | 1497 octave_idx_type *piz = iz.fortran_vec (); |
1501 | 1498 |
1502 F77_XFCN (dgetrf, DGETRF, (nr, nr, tmp_data, nr, pipvt, info)); | 1499 F77_XFCN (dgetrf, DGETRF, (nr, nr, tmp_data, nr, pipvt, info)); |
1503 | 1500 |
1504 if (info != 0) | 1501 if (info != 0) |
1565 { | 1562 { |
1566 char norm = '1'; | 1563 char norm = '1'; |
1567 char uplo = 'U'; | 1564 char uplo = 'U'; |
1568 char dia = 'N'; | 1565 char dia = 'N'; |
1569 | 1566 |
1570 Array<double> z (3 * nc); | 1567 Array<double> z (3 * nc, 1); |
1571 double *pz = z.fortran_vec (); | 1568 double *pz = z.fortran_vec (); |
1572 Array<octave_idx_type> iz (nc); | 1569 Array<octave_idx_type> iz (nc, 1); |
1573 octave_idx_type *piz = iz.fortran_vec (); | 1570 octave_idx_type *piz = iz.fortran_vec (); |
1574 | 1571 |
1575 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), | 1572 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), |
1576 F77_CONST_CHAR_ARG2 (&uplo, 1), | 1573 F77_CONST_CHAR_ARG2 (&uplo, 1), |
1577 F77_CONST_CHAR_ARG2 (&dia, 1), | 1574 F77_CONST_CHAR_ARG2 (&dia, 1), |
1665 { | 1662 { |
1666 char norm = '1'; | 1663 char norm = '1'; |
1667 char uplo = 'L'; | 1664 char uplo = 'L'; |
1668 char dia = 'N'; | 1665 char dia = 'N'; |
1669 | 1666 |
1670 Array<double> z (3 * nc); | 1667 Array<double> z (3 * nc, 1); |
1671 double *pz = z.fortran_vec (); | 1668 double *pz = z.fortran_vec (); |
1672 Array<octave_idx_type> iz (nc); | 1669 Array<octave_idx_type> iz (nc, 1); |
1673 octave_idx_type *piz = iz.fortran_vec (); | 1670 octave_idx_type *piz = iz.fortran_vec (); |
1674 | 1671 |
1675 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), | 1672 F77_XFCN (dtrcon, DTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), |
1676 F77_CONST_CHAR_ARG2 (&uplo, 1), | 1673 F77_CONST_CHAR_ARG2 (&uplo, 1), |
1677 F77_CONST_CHAR_ARG2 (&dia, 1), | 1674 F77_CONST_CHAR_ARG2 (&dia, 1), |
1771 } | 1768 } |
1772 else | 1769 else |
1773 { | 1770 { |
1774 if (calc_cond) | 1771 if (calc_cond) |
1775 { | 1772 { |
1776 Array<double> z (3 * nc); | 1773 Array<double> z (3 * nc, 1); |
1777 double *pz = z.fortran_vec (); | 1774 double *pz = z.fortran_vec (); |
1778 Array<octave_idx_type> iz (nc); | 1775 Array<octave_idx_type> iz (nc, 1); |
1779 octave_idx_type *piz = iz.fortran_vec (); | 1776 octave_idx_type *piz = iz.fortran_vec (); |
1780 | 1777 |
1781 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1), | 1778 F77_XFCN (dpocon, DPOCON, (F77_CONST_CHAR_ARG2 (&job, 1), |
1782 nr, tmp_data, nr, anorm, | 1779 nr, tmp_data, nr, anorm, |
1783 rcon, pz, piz, info | 1780 rcon, pz, piz, info |
1823 | 1820 |
1824 if (typ == MatrixType::Full) | 1821 if (typ == MatrixType::Full) |
1825 { | 1822 { |
1826 info = 0; | 1823 info = 0; |
1827 | 1824 |
1828 Array<octave_idx_type> ipvt (nr); | 1825 Array<octave_idx_type> ipvt (nr, 1); |
1829 octave_idx_type *pipvt = ipvt.fortran_vec (); | 1826 octave_idx_type *pipvt = ipvt.fortran_vec (); |
1830 | 1827 |
1831 Matrix atmp = *this; | 1828 Matrix atmp = *this; |
1832 double *tmp_data = atmp.fortran_vec (); | 1829 double *tmp_data = atmp.fortran_vec (); |
1833 if(anorm < 0.) | 1830 if(anorm < 0.) |
1834 anorm = atmp.abs().sum().row(static_cast<octave_idx_type>(0)).max(); | 1831 anorm = atmp.abs().sum().row(static_cast<octave_idx_type>(0)).max(); |
1835 | 1832 |
1836 Array<double> z (4 * nc); | 1833 Array<double> z (4 * nc, 1); |
1837 double *pz = z.fortran_vec (); | 1834 double *pz = z.fortran_vec (); |
1838 Array<octave_idx_type> iz (nc); | 1835 Array<octave_idx_type> iz (nc, 1); |
1839 octave_idx_type *piz = iz.fortran_vec (); | 1836 octave_idx_type *piz = iz.fortran_vec (); |
1840 | 1837 |
1841 F77_XFCN (dgetrf, DGETRF, (nr, nr, tmp_data, nr, pipvt, info)); | 1838 F77_XFCN (dgetrf, DGETRF, (nr, nr, tmp_data, nr, pipvt, info)); |
1842 | 1839 |
1843 // Throw-away extra info LAPACK gives so as to not change output. | 1840 // Throw-away extra info LAPACK gives so as to not change output. |
2262 | 2259 |
2263 Matrix atmp = *this; | 2260 Matrix atmp = *this; |
2264 double *tmp_data = atmp.fortran_vec (); | 2261 double *tmp_data = atmp.fortran_vec (); |
2265 | 2262 |
2266 double *pretval = retval.fortran_vec (); | 2263 double *pretval = retval.fortran_vec (); |
2267 Array<double> s (minmn); | 2264 Array<double> s (minmn, 1); |
2268 double *ps = s.fortran_vec (); | 2265 double *ps = s.fortran_vec (); |
2269 | 2266 |
2270 // Ask DGELSD what the dimension of WORK should be. | 2267 // Ask DGELSD what the dimension of WORK should be. |
2271 octave_idx_type lwork = -1; | 2268 octave_idx_type lwork = -1; |
2272 | 2269 |
2273 Array<double> work (1); | 2270 Array<double> work (1, 1); |
2274 | 2271 |
2275 octave_idx_type smlsiz; | 2272 octave_idx_type smlsiz; |
2276 F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("DGELSD", 6), | 2273 F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("DGELSD", 6), |
2277 F77_CONST_CHAR_ARG2 (" ", 1), | 2274 F77_CONST_CHAR_ARG2 (" ", 1), |
2278 0, 0, 0, 0, smlsiz | 2275 0, 0, 0, 0, smlsiz |
2300 nlvl = 0; | 2297 nlvl = 0; |
2301 | 2298 |
2302 octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn; | 2299 octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn; |
2303 if (liwork < 1) | 2300 if (liwork < 1) |
2304 liwork = 1; | 2301 liwork = 1; |
2305 Array<octave_idx_type> iwork (liwork); | 2302 Array<octave_idx_type> iwork (liwork, 1); |
2306 octave_idx_type* piwork = iwork.fortran_vec (); | 2303 octave_idx_type* piwork = iwork.fortran_vec (); |
2307 | 2304 |
2308 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn, | 2305 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn, |
2309 ps, rcon, rank, work.fortran_vec (), | 2306 ps, rcon, rank, work.fortran_vec (), |
2310 lwork, piwork, info)); | 2307 lwork, piwork, info)); |
2345 if (work(0) < lworkaround) | 2342 if (work(0) < lworkaround) |
2346 work(0) = lworkaround; | 2343 work(0) = lworkaround; |
2347 } | 2344 } |
2348 | 2345 |
2349 lwork = static_cast<octave_idx_type> (work(0)); | 2346 lwork = static_cast<octave_idx_type> (work(0)); |
2350 work.resize (lwork); | 2347 work.resize (lwork, 1); |
2351 | 2348 |
2352 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, | 2349 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, |
2353 maxmn, ps, rcon, rank, | 2350 maxmn, ps, rcon, rank, |
2354 work.fortran_vec (), lwork, | 2351 work.fortran_vec (), lwork, |
2355 piwork, info)); | 2352 piwork, info)); |
2463 | 2460 |
2464 Matrix atmp = *this; | 2461 Matrix atmp = *this; |
2465 double *tmp_data = atmp.fortran_vec (); | 2462 double *tmp_data = atmp.fortran_vec (); |
2466 | 2463 |
2467 double *pretval = retval.fortran_vec (); | 2464 double *pretval = retval.fortran_vec (); |
2468 Array<double> s (minmn); | 2465 Array<double> s (minmn, 1); |
2469 double *ps = s.fortran_vec (); | 2466 double *ps = s.fortran_vec (); |
2470 | 2467 |
2471 // Ask DGELSD what the dimension of WORK should be. | 2468 // Ask DGELSD what the dimension of WORK should be. |
2472 octave_idx_type lwork = -1; | 2469 octave_idx_type lwork = -1; |
2473 | 2470 |
2474 Array<double> work (1); | 2471 Array<double> work (1, 1); |
2475 | 2472 |
2476 octave_idx_type smlsiz; | 2473 octave_idx_type smlsiz; |
2477 F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("DGELSD", 6), | 2474 F77_FUNC (xilaenv, XILAENV) (9, F77_CONST_CHAR_ARG2 ("DGELSD", 6), |
2478 F77_CONST_CHAR_ARG2 (" ", 1), | 2475 F77_CONST_CHAR_ARG2 (" ", 1), |
2479 0, 0, 0, 0, smlsiz | 2476 0, 0, 0, 0, smlsiz |
2494 nlvl = 0; | 2491 nlvl = 0; |
2495 | 2492 |
2496 octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn; | 2493 octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn; |
2497 if (liwork < 1) | 2494 if (liwork < 1) |
2498 liwork = 1; | 2495 liwork = 1; |
2499 Array<octave_idx_type> iwork (liwork); | 2496 Array<octave_idx_type> iwork (liwork, 1); |
2500 octave_idx_type* piwork = iwork.fortran_vec (); | 2497 octave_idx_type* piwork = iwork.fortran_vec (); |
2501 | 2498 |
2502 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn, | 2499 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn, |
2503 ps, rcon, rank, work.fortran_vec (), | 2500 ps, rcon, rank, work.fortran_vec (), |
2504 lwork, piwork, info)); | 2501 lwork, piwork, info)); |
2505 | 2502 |
2506 lwork = static_cast<octave_idx_type> (work(0)); | 2503 lwork = static_cast<octave_idx_type> (work(0)); |
2507 work.resize (lwork); | 2504 work.resize (lwork, 1); |
2508 | 2505 |
2509 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, | 2506 F77_XFCN (dgelsd, DGELSD, (m, n, nrhs, tmp_data, m, pretval, |
2510 maxmn, ps, rcon, rank, | 2507 maxmn, ps, rcon, rank, |
2511 work.fortran_vec (), lwork, | 2508 work.fortran_vec (), lwork, |
2512 piwork, info)); | 2509 piwork, info)); |
2829 } | 2826 } |
2830 | 2827 |
2831 Matrix | 2828 Matrix |
2832 Matrix::diag (octave_idx_type k) const | 2829 Matrix::diag (octave_idx_type k) const |
2833 { | 2830 { |
2834 return MArray2<double>::diag (k); | 2831 return MArray<double>::diag (k); |
2835 } | 2832 } |
2836 | 2833 |
2837 ColumnVector | 2834 ColumnVector |
2838 Matrix::row_min (void) const | 2835 Matrix::row_min (void) const |
2839 { | 2836 { |
2850 octave_idx_type nc = cols (); | 2847 octave_idx_type nc = cols (); |
2851 | 2848 |
2852 if (nr > 0 && nc > 0) | 2849 if (nr > 0 && nc > 0) |
2853 { | 2850 { |
2854 result.resize (nr); | 2851 result.resize (nr); |
2855 idx_arg.resize (nr); | 2852 idx_arg.resize (nr, 1); |
2856 | 2853 |
2857 for (octave_idx_type i = 0; i < nr; i++) | 2854 for (octave_idx_type i = 0; i < nr; i++) |
2858 { | 2855 { |
2859 octave_idx_type idx_j; | 2856 octave_idx_type idx_j; |
2860 | 2857 |
2905 octave_idx_type nc = cols (); | 2902 octave_idx_type nc = cols (); |
2906 | 2903 |
2907 if (nr > 0 && nc > 0) | 2904 if (nr > 0 && nc > 0) |
2908 { | 2905 { |
2909 result.resize (nr); | 2906 result.resize (nr); |
2910 idx_arg.resize (nr); | 2907 idx_arg.resize (nr, 1); |
2911 | 2908 |
2912 for (octave_idx_type i = 0; i < nr; i++) | 2909 for (octave_idx_type i = 0; i < nr; i++) |
2913 { | 2910 { |
2914 octave_idx_type idx_j; | 2911 octave_idx_type idx_j; |
2915 | 2912 |
2960 octave_idx_type nc = cols (); | 2957 octave_idx_type nc = cols (); |
2961 | 2958 |
2962 if (nr > 0 && nc > 0) | 2959 if (nr > 0 && nc > 0) |
2963 { | 2960 { |
2964 result.resize (nc); | 2961 result.resize (nc); |
2965 idx_arg.resize (nc); | 2962 idx_arg.resize (1, nc); |
2966 | 2963 |
2967 for (octave_idx_type j = 0; j < nc; j++) | 2964 for (octave_idx_type j = 0; j < nc; j++) |
2968 { | 2965 { |
2969 octave_idx_type idx_i; | 2966 octave_idx_type idx_i; |
2970 | 2967 |
3015 octave_idx_type nc = cols (); | 3012 octave_idx_type nc = cols (); |
3016 | 3013 |
3017 if (nr > 0 && nc > 0) | 3014 if (nr > 0 && nc > 0) |
3018 { | 3015 { |
3019 result.resize (nc); | 3016 result.resize (nc); |
3020 idx_arg.resize (nc); | 3017 idx_arg.resize (1, nc); |
3021 | 3018 |
3022 for (octave_idx_type j = 0; j < nc; j++) | 3019 for (octave_idx_type j = 0; j < nc; j++) |
3023 { | 3020 { |
3024 octave_idx_type idx_i; | 3021 octave_idx_type idx_i; |
3025 | 3022 |