1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
//! # nalgebra-lapack //! //! Rust library for linear algebra using nalgebra and LAPACK. //! //! ## Documentation //! //! Documentation is available [here](https://docs.rs/nalgebra-lapack/). //! //! ## License //! //! MIT //! //! ## Cargo features to select lapack provider //! //! Like the [lapack crate](https://crates.io/crates/lapack) from which this //! behavior is inherited, nalgebra-lapack uses [cargo //! features](http://doc.crates.io/manifest.html#the-[features]-section) to select //! which lapack provider (or implementation) is used. Command line arguments to //! cargo are the easiest way to do this, and the best provider depends on your //! particular system. In some cases, the providers can be further tuned with //! environment variables. //! //! Below are given examples of how to invoke `cargo build` on two different systems //! using two different providers. The `--no-default-features --features "provider"` //! arguments will be consistent for other `cargo` commands. //! //! ### Ubuntu //! //! As tested on Ubuntu 12.04, do this to build the lapack package against //! the system installation of netlib without LAPACKE (note the E) or //! CBLAS: //! //! ```.ignore //! sudo apt-get install gfortran libblas3gf liblapack3gf //! export CARGO_FEATURE_SYSTEM_NETLIB=1 //! export CARGO_FEATURE_EXCLUDE_LAPACKE=1 //! export CARGO_FEATURE_EXCLUDE_CBLAS=1 //! //! export CARGO_FEATURES='--no-default-features --features netlib' //! cargo build ${CARGO_FEATURES} //! ``` //! //! ### Mac OS X //! //! On Mac OS X, do this to use Apple's Accelerate framework: //! //! ```.ignore //! export CARGO_FEATURES='--no-default-features --features accelerate' //! cargo build ${CARGO_FEATURES} //! ``` //! //! [version-img]: https://img.shields.io/crates/v/nalgebra-lapack.svg //! [version-url]: https://crates.io/crates/nalgebra-lapack //! [status-img]: https://travis-ci.org/strawlab/nalgebra-lapack.svg?branch=master //! [status-url]: https://travis-ci.org/strawlab/nalgebra-lapack //! [doc-img]: https://docs.rs/nalgebra-lapack/badge.svg //! [doc-url]: https://docs.rs/nalgebra-lapack/ //! //! ## Contributors //! This integration of LAPACK on nalgebra was //! [initiated](https://github.com/strawlab/nalgebra-lapack) by Andrew Straw. It //! then became officially supported and integrated to the main nalgebra //! repository. #![deny(non_camel_case_types)] #![deny(unused_parens)] #![deny(non_upper_case_globals)] #![deny(unused_qualifications)] #![deny(unused_results)] #![deny(missing_docs)] #![doc(html_root_url = "http://nalgebra.org/rustdoc")] extern crate alga; extern crate lapack; extern crate nalgebra as na; extern crate num_complex; extern crate num_traits as num; mod lapack_check; mod svd; mod eigen; mod symmetric_eigen; mod cholesky; mod lu; mod qr; mod hessenberg; mod schur; use num_complex::Complex; pub use self::svd::SVD; pub use self::cholesky::{Cholesky, CholeskyScalar}; pub use self::lu::{LUScalar, LU}; pub use self::eigen::Eigen; pub use self::symmetric_eigen::SymmetricEigen; pub use self::qr::QR; pub use self::hessenberg::Hessenberg; pub use self::schur::RealSchur; trait ComplexHelper { type RealPart; fn real_part(self) -> Self::RealPart; } impl ComplexHelper for f32 { type RealPart = f32; #[inline] fn real_part(self) -> Self::RealPart { self } } impl ComplexHelper for f64 { type RealPart = f64; #[inline] fn real_part(self) -> Self::RealPart { self } } impl ComplexHelper for Complex<f32> { type RealPart = f32; #[inline] fn real_part(self) -> Self::RealPart { self.re } } impl ComplexHelper for Complex<f64> { type RealPart = f64; #[inline] fn real_part(self) -> Self::RealPart { self.re } } unsafe fn uninitialized_vec<T: Copy>(n: usize) -> Vec<T> { let mut res = Vec::new(); res.reserve_exact(n); res.set_len(n); res }