chore: update changelog

This commit is contained in:
Sébastien Crozet 2024-03-28 15:34:41 +01:00
parent c475c4000c
commit a803815bd1
No known key found for this signature in database
GPG Key ID: 92EBE6CA51F3D534
1 changed files with 520 additions and 355 deletions

View File

@ -1,4 +1,5 @@
# Change Log # Change Log
All notable changes to `nalgebra`, starting with the version 0.6.0 will be All notable changes to `nalgebra`, starting with the version 0.6.0 will be
documented here. documented here.
@ -7,17 +8,32 @@ This project adheres to [Semantic Versioning](https://semver.org/).
## Unreleased ## Unreleased
### Removed ### Removed
- The `cuda` feature has been removed, as the toolchain it depends on - The `cuda` feature has been removed, as the toolchain it depends on
is long abandoned. is long abandoned.
## [0.32.5] (28 March 2024)
## Fixed
- Fix numerical issue on SVD with near-identity matrix.
## [0.32.4] (19 Feb 2023)
### Added
- Add the `glam-0.25` feature to enable conversion from/to types from `glam` v0.25.
## [0.32.3] (09 July 2023) ## [0.32.3] (09 July 2023)
### Modified ### Modified
- Statically sized matrices are now serialized as tuples to match how serde - Statically sized matrices are now serialized as tuples to match how serde
serialized plain arrays. serialized plain arrays.
- Dont require `Scalar` for matrix `PartialEq` and `Eq`. - Dont require `Scalar` for matrix `PartialEq` and `Eq`.
### Added ### Added
- Allow trailing punctuation in macros `vector!`, `matrix!`, `point!`, etc. - Allow trailing punctuation in macros `vector!`, `matrix!`, `point!`, etc.
- Add the methods `Matrix1::as_scalar`, `::as_scalar_mut`, `::to_scalar`, `::into_scalar`. - Add the methods `Matrix1::as_scalar`, `::as_scalar_mut`, `::to_scalar`, `::into_scalar`.
- Add `Rotation3::euler_angles_ordered`, a generalized euler angles calculation. - Add `Rotation3::euler_angles_ordered`, a generalized euler angles calculation.
@ -27,21 +43,25 @@ This project adheres to [Semantic Versioning](https://semver.org/).
- Implement `Clone` for `MatrixIter`. - Implement `Clone` for `MatrixIter`.
### Fixed ### Fixed
- Fixed severe catastrophic cancellation issue in variance calculation. - Fixed severe catastrophic cancellation issue in variance calculation.
## [0.32.2] (07 March 2023) ## [0.32.2] (07 March 2023)
### Added ### Added
- Add the `glam-0.23` to enable conversion from/to type from `glam` v0.23. - Add the `glam-0.23` to enable conversion from/to type from `glam` v0.23.
## [0.32.1] (14 Jan. 2023) ## [0.32.1] (14 Jan. 2023)
### Modified ### Modified
- Updated `nalgebra-macros` to use the new `Dyn`, avoiding macro-generated deprecation warnings. - Updated `nalgebra-macros` to use the new `Dyn`, avoiding macro-generated deprecation warnings.
## [0.32.0] (14 Jan. 2023) ## [0.32.0] (14 Jan. 2023)
### Modified ### Modified
- Renamed all `MatrixSlice` types to `MatrixView`. In general all occurrences of the world `Slice` or `slice` have been - Renamed all `MatrixSlice` types to `MatrixView`. In general all occurrences of the world `Slice` or `slice` have been
replaced by `View` or `view`. replaced by `View` or `view`.
- Deprecated all the types involving `Slice` in its name, in favor of the word `View`. - Deprecated all the types involving `Slice` in its name, in favor of the word `View`.
@ -49,10 +69,12 @@ This project adheres to [Semantic Versioning](https://semver.org/).
- Renamed `Dynamic` to `Dyn` and make `Dyn` a tuple struct. - Renamed `Dynamic` to `Dyn` and make `Dyn` a tuple struct.
### Added ### Added
- Add `Cholesky::ln_determinant` to compute the natural logarithm of the determinant of a matrix decomposed - Add `Cholesky::ln_determinant` to compute the natural logarithm of the determinant of a matrix decomposed
with Cholesky. This can be more numerically stable than computing the determinant itself when very small and/or with Cholesky. This can be more numerically stable than computing the determinant itself when very small and/or
large values are involved. large values are involved.
- Added new methods `Matrix::as_view` and `Matrix::as_view_mut`, which are very useful when working with view-based APIs. - Added new methods `Matrix::as_view` and `Matrix::as_view_mut`, which are very useful when working with view-based
APIs.
- Added parallel column iterator using `rayon`: `Matrix::par_column_iter` and `Matrix::par_column_iter_mut`. The `rayon` - Added parallel column iterator using `rayon`: `Matrix::par_column_iter` and `Matrix::par_column_iter_mut`. The `rayon`
feature must be enabled to access these methods. feature must be enabled to access these methods.
- Implement `ReshapableStorage` for matrix slices (only for unit strides at the moment). - Implement `ReshapableStorage` for matrix slices (only for unit strides at the moment).
@ -60,76 +82,89 @@ This project adheres to [Semantic Versioning](https://semver.org/).
`Const::<4>` when we need const dimensions. `Const::<4>` when we need const dimensions.
### Fixed ### Fixed
- Fixed the implementation of `Rotation3::euler_angles` to return the angles in the documented order (roll, pitch, yaw). - Fixed the implementation of `Rotation3::euler_angles` to return the angles in the documented order (roll, pitch, yaw).
## [0.31.4] (13 Nov. 2022) ## [0.31.4] (13 Nov. 2022)
### Added ### Added
- Add a `convert-glam022` feature to enable conversion between `nalgebra` and `glam v0.22`.
- Add a `convert-glam022` feature to enable conversion between `nalgebra` and `glam v0.22`.
## [0.31.3] (30 Oct. 2022) ## [0.31.3] (30 Oct. 2022)
### Added ### Added
- Add `Matrix::try_cast` to attempt casting the inner scalar types when that cast may fail. - Add `Matrix::try_cast` to attempt casting the inner scalar types when that cast may fail.
### Fixed ### Fixed
- Fixed the usage of `CheckBytes` with `rkyv`. - Fixed the usage of `CheckBytes` with `rkyv`.
## [0.31.2] (09 Oct. 2022) ## [0.31.2] (09 Oct. 2022)
### Modified ### Modified
- Use `#[inline]` on the `Dim` implementation for `Const` to improve opt-level 1 performance. - Use `#[inline]` on the `Dim` implementation for `Const` to improve opt-level 1 performance.
- Make the `Point::new` constructions const-fn. - Make the `Point::new` constructions const-fn.
### Added ### Added
- Add `UnitVector::cast` to change the underlying scalar type.
- Add `UnitVector::cast` to change the underlying scalar type.
## [0.31.1] (31 July 2022) ## [0.31.1] (31 July 2022)
### Modified ### Modified
- Improve performances of multiplication of two sparse matrices. - Improve performances of multiplication of two sparse matrices.
### Added ### Added
- Add `Matrix::from_row_iterator` to build a matrix from an iterator yielding components in row-major order. - Add `Matrix::from_row_iterator` to build a matrix from an iterator yielding components in row-major order.
- Add support for conversion from/to types of `glam` 0.21. - Add support for conversion from/to types of `glam` 0.21.
- `nalgebra-sparse`: add support for the matrix-market export of sparse matrices. - `nalgebra-sparse`: add support for the matrix-market export of sparse matrices.
- `nalgebra-lapack`: add a `GE` for solving the generalized eigenvalues problem. - `nalgebra-lapack`: add a `GE` for solving the generalized eigenvalues problem.
### Fixed ### Fixed
- Fix `Rotation3::from_matrix` and `UnitQuaternion::from_matrix` when the input matrix is already a valid - Fix `Rotation3::from_matrix` and `UnitQuaternion::from_matrix` when the input matrix is already a valid
rotation matrix. rotation matrix.
## [0.31.0] (30 Apr. 2022) ## [0.31.0] (30 Apr. 2022)
### Breaking changes ### Breaking changes
- Switch to `cust` 0.3 (for CUDA support). - Switch to `cust` 0.3 (for CUDA support).
- Switch to `rkyv` 0.7 - Switch to `rkyv` 0.7
- Remove support for serialization based on `abomonation`. - Remove support for serialization based on `abomonation`.
- Remove support for conversions between `nalgebra` types and `glam` 0.13. - Remove support for conversions between `nalgebra` types and `glam` 0.13.
### Modified ### Modified
- The aliases for `Const` types have been simplified to help `rust-analyzer`. - The aliases for `Const` types have been simplified to help `rust-analyzer`.
### Added ### Added
- Add `TryFrom` conversion between `UnitVector2/3/4` and `glam`s `Vec2/3/4`. - Add `TryFrom` conversion between `UnitVector2/3/4` and `glam`s `Vec2/3/4`.
- `nalgebra-sparse`: added support for serialization of sparse matrices with `serde`. - `nalgebra-sparse`: added support for serialization of sparse matrices with `serde`.
- `nalgebra-sparse`: add a CSC matrix constructor from unsorted (but valid) data. - `nalgebra-sparse`: add a CSC matrix constructor from unsorted (but valid) data.
- `nalgebra-lapack`: add generalized eigenvalues/eigenvectors calculation + QZ decomposition. - `nalgebra-lapack`: add generalized eigenvalues/eigenvectors calculation + QZ decomposition.
### Fixed ### Fixed
- Improve stability of SVD. - Improve stability of SVD.
- Fix slerp for `UnitComplex`. - Fix slerp for `UnitComplex`.
## [0.30.1] (09 Jan. 2022) ## [0.30.1] (09 Jan. 2022)
### Added ### Added
- Add conversion from/to types of `glam` 0.19 and 0.20. - Add conversion from/to types of `glam` 0.19 and 0.20.
## [0.30.0] (02 Jan. 2022) ## [0.30.0] (02 Jan. 2022)
### Breaking changes ### Breaking changes
- The `Dim` trait is now marked as unsafe. - The `Dim` trait is now marked as unsafe.
- The `Matrix::pow` and `Matrix::pow_mut` methods only allow positive integer exponents now. To compute negative - The `Matrix::pow` and `Matrix::pow_mut` methods only allow positive integer exponents now. To compute negative
exponents, the user is free to invert the matrix before calling `pow` with the exponents absolute value. exponents, the user is free to invert the matrix before calling `pow` with the exponents absolute value.
@ -139,6 +174,7 @@ This project adheres to [Semantic Versioning](https://semver.org/).
return `Option<Self>`, meaning that it could be implemented by any type. return `Option<Self>`, meaning that it could be implemented by any type.
### Modified ### Modified
- Use more concise debug impls for matrices and geometric transformation types. - Use more concise debug impls for matrices and geometric transformation types.
- The singular values computed by the SVD are now sorted in increasing order by default. Use `SVD::new_unordered` - The singular values computed by the SVD are now sorted in increasing order by default. Use `SVD::new_unordered`
instead to reproduce the older behavior without the sorting overhead. instead to reproduce the older behavior without the sorting overhead.
@ -148,6 +184,7 @@ This project adheres to [Semantic Versioning](https://semver.org/).
- The `Matrix::pow` and `Matrix::pow_mut` methods will now also work with integer matrices. - The `Matrix::pow` and `Matrix::pow_mut` methods will now also work with integer matrices.
### Added ### Added
- Added the conversion trait `From<Vec<T>>` and method `from_vec_storage` for `RowDVector`. - Added the conversion trait `From<Vec<T>>` and method `from_vec_storage` for `RowDVector`.
- Added implementation of `From` and `Into` for converting between `nalgebra` types and types from - Added implementation of `From` and `Into` for converting between `nalgebra` types and types from
`glam 0.18`. These can be enabled by enabling the `convert-glam018` cargo features. `glam 0.18`. These can be enabled by enabling the `convert-glam018` cargo features.
@ -168,6 +205,7 @@ This project adheres to [Semantic Versioning](https://semver.org/).
- `nalgebra-sparse`: added reading MatrixMarked data files to a sparse `CooMatrix`. - `nalgebra-sparse`: added reading MatrixMarked data files to a sparse `CooMatrix`.
### Fixed ### Fixed
- Fixed a potential unsoundness with `matrix.get(i)` and `matrix.get_mut(i)` where `i` is an `usize`, and `matrix` - Fixed a potential unsoundness with `matrix.get(i)` and `matrix.get_mut(i)` where `i` is an `usize`, and `matrix`
is a matrix slice with non-default strides. is a matrix slice with non-default strides.
- Fixed potential unsoundness with `vector.perp` where `vector` isnt actually a 2D vector as expected. - Fixed potential unsoundness with `vector.perp` where `vector` isnt actually a 2D vector as expected.
@ -176,9 +214,10 @@ This project adheres to [Semantic Versioning](https://semver.org/).
- Fixed the `no-std` build of `nalgebra-glm`. - Fixed the `no-std` build of `nalgebra-glm`.
- Fix the `pow` and `pow_mut` functions (the result was incorrect for some exponent values). - Fix the `pow` and `pow_mut` functions (the result was incorrect for some exponent values).
## [0.29.0] ## [0.29.0]
### Breaking changes ### Breaking changes
- We updated to the version 0.6 of `simba`. This means that the trait bounds `T: na::RealField`, `na::ComplexField`, - We updated to the version 0.6 of `simba`. This means that the trait bounds `T: na::RealField`, `na::ComplexField`,
`na::SimdRealField`, `na:SimdComplexField` no imply that `T: Copy` (they only imply that `T: Clone`). This may affect `na::SimdRealField`, `na:SimdComplexField` no imply that `T: Copy` (they only imply that `T: Clone`). This may affect
generic code. generic code.
@ -190,6 +229,7 @@ This project adheres to [Semantic Versioning](https://semver.org/).
way. way.
### Modified ### Modified
- `Orthographic3::from_matrix_unchecked` is now `const fn`. - `Orthographic3::from_matrix_unchecked` is now `const fn`.
- `Perspective3::from_matrix_unchecked` is now `const fn`. - `Perspective3::from_matrix_unchecked` is now `const fn`.
- `Rotation::from_matrix_unchecked` is now `const fn`. - `Rotation::from_matrix_unchecked` is now `const fn`.
@ -197,6 +237,7 @@ This project adheres to [Semantic Versioning](https://semver.org/).
`Copy` are now much safer to work with thanks to the refactoring of the `Allocator` system. `Copy` are now much safer to work with thanks to the refactoring of the `Allocator` system.
### Added ### Added
- The conversion traits form the `bytemuck` crates are now implemented for the geometric types too. - The conversion traits form the `bytemuck` crates are now implemented for the geometric types too.
- Added operator overloading for `Transform * UnitComplex`, `UnitComplex * Transform`, `Transform ×= UnitComplex`, - Added operator overloading for `Transform * UnitComplex`, `UnitComplex * Transform`, `Transform ×= UnitComplex`,
`Transform ÷= UnitComplex`. `Transform ÷= UnitComplex`.
@ -207,16 +248,21 @@ This project adheres to [Semantic Versioning](https://semver.org/).
cargo features. cargo features.
## [0.28.0] ## [0.28.0]
### Added ### Added
- Implement `Hash` for `Transform`. - Implement `Hash` for `Transform`.
- Implement `Borrow` and `BorrowMut` for contiguous slices. - Implement `Borrow` and `BorrowMut` for contiguous slices.
### Modified ### Modified
- The `OPoint<T, D>` type has been added. It takes the dimension number as a type-level integer (e.g. `Const<3>`) instead
- The `OPoint<T, D>` type has been added. It takes the dimension number as a type-level integer (e.g. `Const<3>`)
instead
of a const-generic. The type `Point<T, const D: usize>` is now an alias for `OPoint`. This changes doesn't affect any of a const-generic. The type `Point<T, const D: usize>` is now an alias for `OPoint`. This changes doesn't affect any
of the existing code using `Point`. However, it will allow the use `OPoint` in a generic context where the dimension of the existing code using `Point`. However, it will allow the use `OPoint` in a generic context where the dimension
cannot be easily expressed as a const-generic (because of the current limitation of const-generics in Rust). cannot be easily expressed as a const-generic (because of the current limitation of const-generics in Rust).
- Several clippy warnings were fixed. This results in some method signature changes (e.g. taking `self` instead of `&self`) - Several clippy warnings were fixed. This results in some method signature changes (e.g. taking `self` instead
of `&self`)
but this should not have any practical infulances on existing codebase. but this should not have any practical infulances on existing codebase.
- The `Point::new` constructors are no longer const-fn. This is due to some limitations in const-fn - The `Point::new` constructors are no longer const-fn. This is due to some limitations in const-fn
not allowing custom trait-bounds. Use the `point!` macro instead to build points in const environments. not allowing custom trait-bounds. Use the `point!` macro instead to build points in const environments.
@ -224,30 +270,38 @@ This project adheres to [Semantic Versioning](https://semver.org/).
- Methods returning `Result<(), ()>` now return `bool` instead. - Methods returning `Result<(), ()>` now return `bool` instead.
### Fixed ### Fixed
- Fixed a potential unsoundess issue when converting a mutable slice to a `&mut[T]`. - Fixed a potential unsoundess issue when converting a mutable slice to a `&mut[T]`.
## [0.27.1] ## [0.27.1]
### Fixed ### Fixed
- Fixed a bug in the conversion from `glam::Vec2` or `glam::DVec2` to `Isometry2`. - Fixed a bug in the conversion from `glam::Vec2` or `glam::DVec2` to `Isometry2`.
## [0.27.0] ## [0.27.0]
This removes the `convert-glam` and `convert-glam-unchecked` optional features. This removes the `convert-glam` and `convert-glam-unchecked` optional features.
Instead, this adds the `convert-glam013`, `convert-glam014`, and `convert-glam015` optional features for Instead, this adds the `convert-glam013`, `convert-glam014`, and `convert-glam015` optional features for
conversions targeting the versions 0.13, 0.14, and 0.15 of `glam`. conversions targeting the versions 0.13, 0.14, and 0.15 of `glam`.
### Added ### Added
- Add macros `matrix!`, `dmatrix!`, `vector!`, `dvector!`, `point!` for constructing matrices/vectors/points in a - Add macros `matrix!`, `dmatrix!`, `vector!`, `dvector!`, `point!` for constructing matrices/vectors/points in a
more convenient way. See [#886](https://github.com/dimforge/nalgebra/pull/886) and [#899](https://github.com/dimforge/nalgebra/pull/899). more convenient way. See [#886](https://github.com/dimforge/nalgebra/pull/886)
and [#899](https://github.com/dimforge/nalgebra/pull/899).
- Add `CooMatrix::reserve` to `nalgebra-sparse`. - Add `CooMatrix::reserve` to `nalgebra-sparse`.
- Add basic support for serialization using `rkyv`. Can be enabled with the features `rkyv-serialize` or - Add basic support for serialization using `rkyv`. Can be enabled with the features `rkyv-serialize` or
`rkyv-serialize-no-std`. `rkyv-serialize-no-std`.
### Fixed ### Fixed
- Fixed a potential unsoundness issue after deserializing an invalid `DVector` using `serde`. - Fixed a potential unsoundness issue after deserializing an invalid `DVector` using `serde`.
## [0.26.2] ## [0.26.2]
### Added ### Added
- Conversion from an array `[T; D]` to an isometry `Isometry<T, _, D>` (as a translation). - Conversion from an array `[T; D]` to an isometry `Isometry<T, _, D>` (as a translation).
- Conversion from a static vector `SVector<T; D>` to an isometry `Isometry<T, _, D>` (as a translation). - Conversion from a static vector `SVector<T; D>` to an isometry `Isometry<T, _, D>` (as a translation).
- Conversion from a point `Point<T; D>` to an isometry `Isometry<T, _, D>` (as a translation). - Conversion from a point `Point<T; D>` to an isometry `Isometry<T, _, D>` (as a translation).
@ -257,14 +311,17 @@ conversions targeting the versions 0.13, 0.14, and 0.15 of `glam`.
- Conversion of a glam type `Vec2/3/4` from/to a `Translation2/3/4`. - Conversion of a glam type `Vec2/3/4` from/to a `Translation2/3/4`.
## [0.26.1] ## [0.26.1]
Fix a regression introduced in 0.26.0 preventing `DVector` from being serialized with `serde`. Fix a regression introduced in 0.26.0 preventing `DVector` from being serialized with `serde`.
## [0.26.0] ## [0.26.0]
This release integrates `min-const-generics` to nalgebra. See This release integrates `min-const-generics` to nalgebra. See
[our blog post](https://www.dimforge.com/blog/2021/04/12/integrating-const-generics-to-nalgebra) [our blog post](https://www.dimforge.com/blog/2021/04/12/integrating-const-generics-to-nalgebra)
for details about this release. for details about this release.
### Added ### Added
- Add type aliases for unit vector, e.g., `UnitVector3`. - Add type aliases for unit vector, e.g., `UnitVector3`.
- Add a `pow` and `pow_mut` function to square matrices. - Add a `pow` and `pow_mut` function to square matrices.
- Add `Cholesky::determinant` to compute the determinant of a matrix decomposed - Add `Cholesky::determinant` to compute the determinant of a matrix decomposed
@ -272,8 +329,8 @@ for details about this release.
- Add the `serde-serialize-no-std` feature to enable serialization of static matrices/vectors - Add the `serde-serialize-no-std` feature to enable serialization of static matrices/vectors
with serde, but without requiring `std`. with serde, but without requiring `std`.
### Modified ### Modified
- The `serde` crate isn't enabled by default now. Enable the `serde-serialize` or the - The `serde` crate isn't enabled by default now. Enable the `serde-serialize` or the
`serde-serialize-no-std` features instead. `serde-serialize-no-std` features instead.
- The `Const<const D: usize>` type has been introduced to represent dimensions known - The `Const<const D: usize>` type has been introduced to represent dimensions known
@ -295,16 +352,22 @@ for details about this release.
constructor is also a `const fn` now. constructor is also a `const fn` now.
## [0.25.4] ## [0.25.4]
### Fixed ### Fixed
- Fix a compilation error when only the `serde-serialize` feature is enabled. - Fix a compilation error when only the `serde-serialize` feature is enabled.
## [0.25.3] ## [0.25.3]
### Added ### Added
- The `Vector::simd_cap_magnitude` method to cap the magnitude of the vector with - The `Vector::simd_cap_magnitude` method to cap the magnitude of the vector with
SIMD components. SIMD components.
## [0.25.2] ## [0.25.2]
### Added ### Added
- A `convert-glam` cargo feature to enable implementations of `From` traits to convert - A `convert-glam` cargo feature to enable implementations of `From` traits to convert
between `glam` types and `nalgebra` types. between `glam` types and `nalgebra` types.
- A `convert-glam-unchecked` cargo feature to enable some extra `glam`/`nalgebra` conversions that may - A `convert-glam-unchecked` cargo feature to enable some extra `glam`/`nalgebra` conversions that may
@ -315,56 +378,70 @@ for details about this release.
type of the components of a given entity. Example: `vector.cast::<f32>()`. type of the components of a given entity. Example: `vector.cast::<f32>()`.
## [0.25.1] ## [0.25.1]
This release replaces the version 0.25.0 which has been yanked. The 0.25.0 version This release replaces the version 0.25.0 which has been yanked. The 0.25.0 version
added significant complication to build `nalgebra` targeting a `#[no-std]` platform added significant complication to build `nalgebra` targeting a `#[no-std]` platform
not supported by `rand`. not supported by `rand`.
The `rand` dependency is now optional (and disabled by default). You may enable it with: The `rand` dependency is now optional (and disabled by default). You may enable it with:
- The `rand-no-std` cargo feature when targeting a `#[no-std]` environment. - The `rand-no-std` cargo feature when targeting a `#[no-std]` environment.
- The `rand` cargo feature when targeting a `std` environment. - The `rand` cargo feature when targeting a `std` environment.
## [0.25.0] - Yanked ## [0.25.0] - Yanked
This updates all the dependencies of nalgebra to their latest version, including: This updates all the dependencies of nalgebra to their latest version, including:
- rand 0.8 - rand 0.8
- proptest 1.0 - proptest 1.0
- simba 0.4 - simba 0.4
### New crate: nalgebra-sparse ### New crate: nalgebra-sparse
Alongside this release of `nalgebra`, we are releasing `nalgebra-sparse`: a crate dedicated to sparse matrix Alongside this release of `nalgebra`, we are releasing `nalgebra-sparse`: a crate dedicated to sparse matrix
computation with `nalgebra`. The `sparse` module of `nalgebra`itself still exists for backward compatibility, computation with `nalgebra`. The `sparse` module of `nalgebra`itself still exists for backward compatibility,
but it will be deprecated soon in favor of the `nalgebra-sparse` crate. but it will be deprecated soon in favor of the `nalgebra-sparse` crate.
### Added ### Added
* Add `UnitDualQuaternion`, a dual-quaternion with unit magnitude which can be used as an isometry transformation. * Add `UnitDualQuaternion`, a dual-quaternion with unit magnitude which can be used as an isometry transformation.
* Add `UDU::new()` and `matrix.udu()` to compute the UDU factorization of a matrix. * Add `UDU::new()` and `matrix.udu()` to compute the UDU factorization of a matrix.
* Add `ColPivQR::new()` and `matrix.col_piv_qr()` to compute the QR decomposition with column pivoting of a matrix. * Add `ColPivQR::new()` and `matrix.col_piv_qr()` to compute the QR decomposition with column pivoting of a matrix.
* Add `from_basis_unchecked` to all the rotation types. This builds a rotation from a set of basis vectors (representing the columns of the corresponding rotation matrix). * Add `from_basis_unchecked` to all the rotation types. This builds a rotation from a set of basis vectors (representing
the columns of the corresponding rotation matrix).
* Add `Matrix::cap_magnitude` to cap the magnitude of a vector. * Add `Matrix::cap_magnitude` to cap the magnitude of a vector.
* Add `UnitQuaternion::append_axisangle_linearized` to approximately append a rotation represented as an axis-angle to a rotation represented as an unit quaternion. * Add `UnitQuaternion::append_axisangle_linearized` to approximately append a rotation represented as an axis-angle to a
rotation represented as an unit quaternion.
* Mark the iterators on matrix components as `DoubleEndedIter`. * Mark the iterators on matrix components as `DoubleEndedIter`.
* Re-export `simba::simd::SimdValue` at the root of the `nalgebra` crate. * Re-export `simba::simd::SimdValue` at the root of the `nalgebra` crate.
## [0.24.0] ## [0.24.0]
### Added ### Added
* The `DualQuaternion` type. It is still work-in-progress, but the basics are here: * The `DualQuaternion` type. It is still work-in-progress, but the basics are here:
creation from its real and dual part, multiplication of two dual quaternions, creation from its real and dual part, multiplication of two dual quaternions,
and normalization. and normalization.
### Removed ### Removed
* There is no blanket `impl<T> PartialEq for Unit<T>` anymore. Instead, it is * There is no blanket `impl<T> PartialEq for Unit<T>` anymore. Instead, it is
implemented specifically for `UnitComplex`, `UnitQuaternion` and `Unit<Vector>`. implemented specifically for `UnitComplex`, `UnitQuaternion` and `Unit<Vector>`.
## [0.23.2] ## [0.23.2]
In this release, we improved the documentation of some of the geometric types In this release, we improved the documentation of some of the geometric types
by applying changes similar to what we did in the version 0.23.1 for matrices. by applying changes similar to what we did in the version 0.23.1 for matrices.
### Added ### Added
* The `Isometry::inv_mul` method which is a more efficient way of doing * The `Isometry::inv_mul` method which is a more efficient way of doing
`isometry1.inverse() * isometry2`. `isometry1.inverse() * isometry2`.
## [0.23.1] ## [0.23.1]
In this release we improved the documentation of the matrix and vector types by: In this release we improved the documentation of the matrix and vector types by:
- Grouping `impl` bocks logically, adding a title comment to these impl blocks. - Grouping `impl` bocks logically, adding a title comment to these impl blocks.
- Reference these impl blocks docs at the top of the documentation page for `Matrix`. - Reference these impl blocks docs at the top of the documentation page for `Matrix`.
- Reduce the depth of type aliasing. Now all vector and matrix types are aliases of `Matrix` - Reduce the depth of type aliasing. Now all vector and matrix types are aliases of `Matrix`
@ -373,13 +450,17 @@ In this release we improved the documentation of the matrix and vector types by:
## [0.23.0] ## [0.23.0]
### Added ### Added
* The `.inverse_transform_unit_vector(v)` was added to `Rotation2/3`, `Isometry2/3`, `UnitQuaternion`, and `UnitComplex`.
* The `.inverse_transform_unit_vector(v)` was added to `Rotation2/3`, `Isometry2/3`, `UnitQuaternion`,
and `UnitComplex`.
It applies the corresponding rotation to a unit vector `Unit<Vector2/3>`. It applies the corresponding rotation to a unit vector `Unit<Vector2/3>`.
* The `Point.map(f)` and `Point.apply(f)` to apply a function to each component of the point, similarly to `Vector.map(f)` * The `Point.map(f)` and `Point.apply(f)` to apply a function to each component of the point, similarly
to `Vector.map(f)`
and `Vector.apply(f)`. and `Vector.apply(f)`.
* The `Quaternion::from([N; 4])` conversion to build a quaternion from an array of four elements. * The `Quaternion::from([N; 4])` conversion to build a quaternion from an array of four elements.
* The `Isometry::from(Translation)` conversion to build an isometry from a translation. * The `Isometry::from(Translation)` conversion to build an isometry from a translation.
* The `Vector::ith_axis(i)` which build a unit vector, e.g., `Unit<Vector3<f32>>` with its i-th component set to 1.0, and the * The `Vector::ith_axis(i)` which build a unit vector, e.g., `Unit<Vector3<f32>>` with its i-th component set to 1.0,
and the
others set to zero. others set to zero.
* The `Isometry.lerp_slerp` and `Isometry.try_lerp_slerp` methods to interpolate between two isometries using linear * The `Isometry.lerp_slerp` and `Isometry.try_lerp_slerp` methods to interpolate between two isometries using linear
interpolation for the translational part, and spherical interpolation for the rotational part. interpolation for the translational part, and spherical interpolation for the rotational part.
@ -387,12 +468,14 @@ In this release we improved the documentation of the matrix and vector types by:
spherical interpolation. spherical interpolation.
## [0.22.0] ## [0.22.0]
In this release, we are using the new version 0.2 of simba. One major change of that version is that the In this release, we are using the new version 0.2 of simba. One major change of that version is that the
use of `libm` is now opt-in when building targeting `no-std` environment. If you are using floating-point use of `libm` is now opt-in when building targeting `no-std` environment. If you are using floating-point
operations with nalgebra in a `no-std` environment, you will need to enable the new `libm` feature operations with nalgebra in a `no-std` environment, you will need to enable the new `libm` feature
of nalgebra for your code to compile again. of nalgebra for your code to compile again.
### Added ### Added
* The `libm` feature that enables `libm` when building for `no-std` environment. * The `libm` feature that enables `libm` when building for `no-std` environment.
* The `libm-force` feature that enables `libm` even when building for a not `no-std` environment. * The `libm-force` feature that enables `libm` even when building for a not `no-std` environment.
* `Cholesky::new_unchecked` which build a Cholesky decomposition without checking that its input is * `Cholesky::new_unchecked` which build a Cholesky decomposition without checking that its input is
@ -403,6 +486,7 @@ of nalgebra for your code to compile again.
* The `Vector::ith(i, x)` that builds a vector filled with zeros except for the `i`-th component set to `x`. * The `Vector::ith(i, x)` that builds a vector filled with zeros except for the `i`-th component set to `x`.
## [0.21.0] ## [0.21.0]
In this release, we are no longer relying on traits from the __alga__ crate for our generic code. In this release, we are no longer relying on traits from the __alga__ crate for our generic code.
Instead, we use traits from the new [simba](https://crates.io/crates/simba) crate which are both Instead, we use traits from the new [simba](https://crates.io/crates/simba) crate which are both
simpler, and allow for significant optimizations like AoSoA SIMD. simpler, and allow for significant optimizations like AoSoA SIMD.
@ -411,75 +495,98 @@ Refer to the [monthly dimforge blogpost](https://www.dimforge.org/blog/2020/04/0
for details about this switch and its benefits. for details about this switch and its benefits.
### Added ### Added
* It is now possible to use SIMD types like `simba::f32x4` as scalar types for nalgebra's matrices and * It is now possible to use SIMD types like `simba::f32x4` as scalar types for nalgebra's matrices and
geometric types. geometric types.
### Modified ### Modified
* Use of traits like `alga::general::{RealField, ComplexField}` have now been replaced by * Use of traits like `alga::general::{RealField, ComplexField}` have now been replaced by
`simba::scalar::{RealField, ComplexField}`. `simba::scalar::{RealField, ComplexField}`.
* The implementation of traits from the __alga__ crate (and well as the dependency to _alga__) are now * The implementation of traits from the __alga__ crate (and well as the dependency to _alga__) are now
omitted unless the `alga` cargo feature is activated. omitted unless the `alga` cargo feature is activated.
### Removed ### Removed
* The `Neg` unary operator is no longer implemented for `UnitComplex` and `UnitQuaternion`. This caused * The `Neg` unary operator is no longer implemented for `UnitComplex` and `UnitQuaternion`. This caused
hard-to-track errors when we mistakenly write, e.g., `-q * v` instead of `-(q * v)`. hard-to-track errors when we mistakenly write, e.g., `-q * v` instead of `-(q * v)`.
* The `na::convert_unchecked` is no longer marked as unsafe. * The `na::convert_unchecked` is no longer marked as unsafe.
## [0.20.0] ## [0.20.0]
### Added ### Added
* `cholesky.rank_one_update(...)` which performs a rank-one update on the cholesky decomposition of a matrix. * `cholesky.rank_one_update(...)` which performs a rank-one update on the cholesky decomposition of a matrix.
* `From<&Matrix>` is now implemented for matrix slices. * `From<&Matrix>` is now implemented for matrix slices.
* `.try_set_magnitude(...)` which sets the magnitude of a vector, while keeping its direction. * `.try_set_magnitude(...)` which sets the magnitude of a vector, while keeping its direction.
* Implementations of `From` and `Into` for the conversion between matrix slices and standard (`&[N]` `&mut [N]`) slices. * Implementations of `From` and `Into` for the conversion between matrix slices and standard (`&[N]` `&mut [N]`) slices.
### Modified ### Modified
* We started some major changes in order to allow non-Copy types to be used as scalar types inside of matrices/vectors. * We started some major changes in order to allow non-Copy types to be used as scalar types inside of matrices/vectors.
## [0.19.0] ## [0.19.0]
### Added ### Added
* `.remove_rows_at` and `remove_columns_at` which removes a set of rows or columns (specified by indices) from a matrix. * `.remove_rows_at` and `remove_columns_at` which removes a set of rows or columns (specified by indices) from a matrix.
* Several formatting traits have been implemented for all matrices/vectors: `LowerExp`, `UpperExp`, `Octal`, `LowerHex`, * Several formatting traits have been implemented for all matrices/vectors: `LowerExp`, `UpperExp`, `Octal`, `LowerHex`,
`UpperHex`, `Binary`, `Pointer`. `UpperHex`, `Binary`, `Pointer`.
* `UnitQuaternion::quaternions_mean(...)` which computes the mean rotation of a set of unit quaternions. This implements * `UnitQuaternion::quaternions_mean(...)` which computes the mean rotation of a set of unit quaternions. This implements
the algorithm from _Oshman, Yaakov, and Avishy Carmi, "Attitude estimation from vector observations using a genetic-algorithm-embedded quaternion particle filter." the algorithm from _Oshman, Yaakov, and Avishy Carmi, "Attitude estimation from vector observations using a
genetic-algorithm-embedded quaternion particle filter."
### Modified ### Modified
* It is now possible to get the `min/max` element of unsigned integer matrices. * It is now possible to get the `min/max` element of unsigned integer matrices.
### Added to nalgebra-glm ### Added to nalgebra-glm
* Some infinite and reversed perspectives: `::infinite_perspective_rh_no`, `::infinite_perspective_rh_zo`, * Some infinite and reversed perspectives: `::infinite_perspective_rh_no`, `::infinite_perspective_rh_zo`,
`::reversed_perspective_rh_zo`, and `::reversed_infinite_perspective_rh_zo`. `::reversed_perspective_rh_zo`, and `::reversed_infinite_perspective_rh_zo`.
## [0.18.0] ## [0.18.0]
This release adds full complex number support to nalgebra. This includes all common vector/matrix operations as well This release adds full complex number support to nalgebra. This includes all common vector/matrix operations as well
as matrix decomposition. This excludes geometric type (like `Isometry`, `Rotation`, `Translation`, etc.) from the as matrix decomposition. This excludes geometric type (like `Isometry`, `Rotation`, `Translation`, etc.) from the
`geometry` module. `geometry` module.
### Added ### Added
#### Quaternion and geometric operations #### Quaternion and geometric operations
* Add trigonometric functions for quaternions: `.cos, .sin, .tan, .acos, .asin, .atan, .cosh, .sinh, .tanh, .acosh, .asinh, .atanh`.
* Add trigonometric functions for
quaternions: `.cos, .sin, .tan, .acos, .asin, .atan, .cosh, .sinh, .tanh, .acosh, .asinh, .atanh`.
* Add geometric algebra operations for quaternions: `.inner, .outer, .project, .rejection` * Add geometric algebra operations for quaternions: `.inner, .outer, .project, .rejection`
* Add `.left_div, .right_div` for quaternions. * Add `.left_div, .right_div` for quaternions.
* Add `.renormalize` to `Unit<...>` and `Rotation3` to correct potential drift due to repeated operations. * Add `.renormalize` to `Unit<...>` and `Rotation3` to correct potential drift due to repeated operations.
Those drifts could cause them not to be pure rotations anymore. Those drifts could cause them not to be pure rotations anymore.
#### Convolution #### Convolution
* `.convolve_full(kernel)` returns the convolution of `self` by `kernel`. * `.convolve_full(kernel)` returns the convolution of `self` by `kernel`.
* `.convolve_valid(kernel)` returns the convolution of `self` by `kernel` after removal of all the elements relying on zero-padding. * `.convolve_valid(kernel)` returns the convolution of `self` by `kernel` after removal of all the elements relying on
zero-padding.
* `.convolve_same(kernel)` returns the convolution of `self` by `kernel` with a result of the same size as `self`. * `.convolve_same(kernel)` returns the convolution of `self` by `kernel` with a result of the same size as `self`.
#### Complex number support #### Complex number support
* Add the `::from_matrix` constructor too all rotation types to extract a rotation from a raw matrix. * Add the `::from_matrix` constructor too all rotation types to extract a rotation from a raw matrix.
* Add the `::from_matrix_eps` constructor too all rotation types to extract a rotation from a raw matrix. This takes * Add the `::from_matrix_eps` constructor too all rotation types to extract a rotation from a raw matrix. This takes
more argument than `::from_matrix` to control the convergence of the underlying optimization algorithm. more argument than `::from_matrix` to control the convergence of the underlying optimization algorithm.
* Add `.camax()` which returns the matrix component with the greatest L1-norm. * Add `.camax()` which returns the matrix component with the greatest L1-norm.
* Add `.camin()` which returns the matrix component with the smallest L1-norm. * Add `.camin()` which returns the matrix component with the smallest L1-norm.
* Add `.ad_mul(b)` for matrix-multiplication of `self.adjoint() * b`. * Add `.ad_mul(b)` for matrix-multiplication of `self.adjoint() * b`.
* Add `.ad_mul_to(b)` which is the same as `.ad_mul` but with a provided matrix to be filled with the result of the multiplication. * Add `.ad_mul_to(b)` which is the same as `.ad_mul` but with a provided matrix to be filled with the result of the
multiplication.
* Add BLAS operations involving complex conjugation (following similar names as the original BLAS spec): * Add BLAS operations involving complex conjugation (following similar names as the original BLAS spec):
* `.dotc(rhs)` equal to `self.adjoint() * rhs`. * `.dotc(rhs)` equal to `self.adjoint() * rhs`.
* `.gerc(alpha, x, y, beta)` equivalent to `self = alpha * x * y.adjoint() + beta * self` * `.gerc(alpha, x, y, beta)` equivalent to `self = alpha * x * y.adjoint() + beta * self`
* `.hegerc` which is like `gerc` but for Hermitian matrices. * `.hegerc` which is like `gerc` but for Hermitian matrices.
* `.syger` which is the new name of `.ger_symm` which is equivalent to `self = alpha * x * y.transpose() + beta * self`. * `.syger` which is the new name of `.ger_symm` which is equivalent
* `.sygemv` which is the new name of `.gemv_symm` which is equivalent to `self = alpha * a * x + beta * self` with `a` symmetric. to `self = alpha * x * y.transpose() + beta * self`.
* `.sygemv` which is the new name of `.gemv_symm` which is equivalent to `self = alpha * a * x + beta * self`
with `a` symmetric.
* `.hegemv(alpha, a, x, beta)` which is like `.sygemv` but with `a` Hermitian. * `.hegemv(alpha, a, x, beta)` which is like `.sygemv` but with `a` Hermitian.
* `.gemv_ad(alpha, a, x, beta)` which is equivalent to `self = alpha * a.adjoint() * x + beta * self`. * `.gemv_ad(alpha, a, x, beta)` which is equivalent to `self = alpha * a.adjoint() * x + beta * self`.
* `.gemm_ad(alpha, a, b, beta)` which is equivalent to `self = alpha * a.adjoint() * b + beta * self`. * `.gemm_ad(alpha, a, b, beta)` which is equivalent to `self = alpha * a.adjoint() * b + beta * self`.
@ -488,14 +595,17 @@ as matrix decomposition. This excludes geometric type (like `Isometry`, `Rotatio
Note that all the other BLAS operation will continue to work for all fields, including floats and complex numbers. Note that all the other BLAS operation will continue to work for all fields, including floats and complex numbers.
### Renamed ### Renamed
* `RealSchur` has been renamed `Schur` because it can now work with complex matrices.
* `RealSchur` has been renamed `Schur` because it can now work with complex matrices.
## [0.17.0] ## [0.17.0]
### Added ### Added
* Add swizzling up to dimension 3 for vectors. For example, you can do `v.zxy()` as an equivalent to `Vector3::new(v.z, v.x, v.y)`.
* Add swizzling up to dimension 3 for points. For example, you can do `p.zxy()` as an equivalent to `Point3::new(p.z, p.x, p.y)`. * Add swizzling up to dimension 3 for vectors. For example, you can do `v.zxy()` as an equivalent
to `Vector3::new(v.z, v.x, v.y)`.
* Add swizzling up to dimension 3 for points. For example, you can do `p.zxy()` as an equivalent
to `Point3::new(p.z, p.x, p.y)`.
* Add `.copy_from_slice` to copy matrix components from a slice in column-major order. * Add `.copy_from_slice` to copy matrix components from a slice in column-major order.
* Add `.dot` to quaternions. * Add `.dot` to quaternions.
* Add `.zip_zip_map` for iterating on three matrices simultaneously, and applying a closure to them. * Add `.zip_zip_map` for iterating on three matrices simultaneously, and applying a closure to them.
@ -506,7 +616,8 @@ Note that all the other BLAS operation will continue to work for all fields, inc
* Add `From/Into` impls to allow the conversion of any transformation type to a matrix. * Add `From/Into` impls to allow the conversion of any transformation type to a matrix.
* Add `Into` impls to convert a matrix slice into an owned matrix. * Add `Into` impls to convert a matrix slice into an owned matrix.
* Add `Point*::from_slice` to create a point from a slice. * Add `Point*::from_slice` to create a point from a slice.
* Add `.map_with_location` to matrices to apply a map which passes the component indices to the user-defined closure alongside * Add `.map_with_location` to matrices to apply a map which passes the component indices to the user-defined closure
alongside
the component itself. the component itself.
* Add impl `From<Vector>` for `Point`. * Add impl `From<Vector>` for `Point`.
* Add impl `From<Vector4>` for `Quaternion`. * Add impl `From<Vector4>` for `Quaternion`.
@ -516,7 +627,8 @@ Note that all the other BLAS operation will continue to work for all fields, inc
* Add `.to_homogeneous` to square matrices (and with dimensions higher than 1x1). This will increase their number of row * Add `.to_homogeneous` to square matrices (and with dimensions higher than 1x1). This will increase their number of row
and columns by 1. The new column and row are filled with 0, except for the diagonal element which is set to 1. and columns by 1. The new column and row are filled with 0, except for the diagonal element which is set to 1.
* Implement `Extend<Vec>` for matrices with a dynamic storage. The provided `Vec` is assumed to represent a column-major * Implement `Extend<Vec>` for matrices with a dynamic storage. The provided `Vec` is assumed to represent a column-major
matrix with the same number of rows as the one being extended. This will effectively append new columns on the right of matrix with the same number of rows as the one being extended. This will effectively append new columns on the right
of
the matrix being extended. the matrix being extended.
* Implement `Extend<Vec>` for vectors with a dynamic storage. This will concatenate the vector with the given `Vec`. * Implement `Extend<Vec>` for vectors with a dynamic storage. This will concatenate the vector with the given `Vec`.
* Implement `Extend<Matrix<...>>` for matrices with dynamic storage. This will concatenate the columns of both matrices. * Implement `Extend<Matrix<...>>` for matrices with dynamic storage. This will concatenate the columns of both matrices.
@ -525,10 +637,12 @@ Note that all the other BLAS operation will continue to work for all fields, inc
* Add a `.len()` method to retrieve the size of a `MatrixVec`. * Add a `.len()` method to retrieve the size of a `MatrixVec`.
### Modified ### Modified
* The orthographic projection no longer require that `bottom < top`, that `left < right`, and that `znear < zfar`. The * The orthographic projection no longer require that `bottom < top`, that `left < right`, and that `znear < zfar`. The
only restriction now ith that they must not be equal (in which case the projection would be singular). only restriction now ith that they must not be equal (in which case the projection would be singular).
* The `Point::from_coordinates` methods is deprecated. Use `Point::from` instead. * The `Point::from_coordinates` methods is deprecated. Use `Point::from` instead.
* The `.transform_point` and `.transform_vector` methods are now inherent methods for matrices so that the user does not have to * The `.transform_point` and `.transform_vector` methods are now inherent methods for matrices so that the user does not
have to
explicitly import the `Transform` trait from the alga crate. explicitly import the `Transform` trait from the alga crate.
* Renamed the matrix storage types: `MatrixArray` -> `ArrayStorage` and `MatrixVec` -> `VecStorage`. * Renamed the matrix storage types: `MatrixArray` -> `ArrayStorage` and `MatrixVec` -> `VecStorage`.
* Renamed `.unwrap()` to `.into_inner()` for geometric types that wrap another type. * Renamed `.unwrap()` to `.into_inner()` for geometric types that wrap another type.
@ -536,32 +650,46 @@ Note that all the other BLAS operation will continue to work for all fields, inc
* Deprecate several functions at the root of the crate (replaced by methods). * Deprecate several functions at the root of the crate (replaced by methods).
### Removed ### Removed
* Remove the `Deref` impl for `MatrixVec` as it could cause hard-to-understand compilation errors. * Remove the `Deref` impl for `MatrixVec` as it could cause hard-to-understand compilation errors.
### nalgebra-glm ### nalgebra-glm
* Add several alternative projection computations, e.g., `ortho_lh`, `ortho_lh_no`, `perspective_lh`, etc. * Add several alternative projection computations, e.g., `ortho_lh`, `ortho_lh_no`, `perspective_lh`, etc.
* Add features matching those of nalgebra, in particular: `serde-serialize`, `abmonation-serialize`, std` (enabled by default). * Add features matching those of nalgebra, in particular:`serde-serialize`, `abmonation-serialize`, std` (enabled by
default).
## [0.16.0] ## [0.16.0]
All dependencies have been updated to their latest versions. All dependencies have been updated to their latest versions.
## Modified ## Modified
* Adjust `UnitQuaternion`s, `Rotation3`s, and `Rotation2`s generated from the `Standard` distribution to be uniformly distributed.
* Adjust `UnitQuaternion`s, `Rotation3`s, and `Rotation2`s generated from the `Standard` distribution to be uniformly
distributed.
### Added ### Added
* Add a feature `stdweb` to activate the dependency feature `rand/stdweb`. * Add a feature `stdweb` to activate the dependency feature `rand/stdweb`.
* Add blas-like methods `.imin()` and `.imax()` that return the index of the minimum and maximum entry of a vector. * Add blas-like methods `.imin()` and `.imax()` that return the index of the minimum and maximum entry of a vector.
* Add construction of a `Point` from an array by implementing the `From` trait. * Add construction of a `Point` from an array by implementing the `From` trait.
* Add support for generating uniformly distributed random unit column vectors using the `Standard` distribution. * Add support for generating uniformly distributed random unit column vectors using the `Standard` distribution.
## [0.15.0] ## [0.15.0]
The most notable change of this release is the support for using part of the library without the rust standard The most notable change of this release is the support for using part of the library without the rust standard
library (i.e. it supports `#![no_std]`). See the corresponding [documentation](https://nalgebra.org/wasm_and_embedded_programming/). library (i.e. it supports `#![no_std]`). See the
corresponding [documentation](https://nalgebra.org/wasm_and_embedded_programming/).
### Modified ### Modified
* Rename the `core` module to `base` to avoid conflicts with the `core` crate implicitly imported when * Rename the `core` module to `base` to avoid conflicts with the `core` crate implicitly imported when
`#![no_std]` is enabled. `#![no_std]` is enabled.
* Constructors of the `MatrixSlice*` types have been renamed from `new_*` to `from_slice_*`. This was * Constructors of the `MatrixSlice*` types have been renamed from `new_*` to `from_slice_*`. This was
necessary to avoid the `incoherent_fundamental_impls` lint that is going to become a hard error. necessary to avoid the `incoherent_fundamental_impls` lint that is going to become a hard error.
### Added ### Added
* Add `UnitQuaternion` constructor `::new_eps(...)` and `::from_scaled_axis_eps(...)` that return the * Add `UnitQuaternion` constructor `::new_eps(...)` and `::from_scaled_axis_eps(...)` that return the
identity if the magnitude of the input axisangle is smaller than the epsilon provided. identity if the magnitude of the input axisangle is smaller than the epsilon provided.
* Add methods `.rotation_between_axis(...)` and `.scaled_rotation_between_axis(...)` to `UnitComplex` * Add methods `.rotation_between_axis(...)` and `.scaled_rotation_between_axis(...)` to `UnitComplex`
@ -571,9 +699,13 @@ library (i.e. it supports `#![no_std]`). See the corresponding [documentation](h
* Add functions to construct a random matrix with a user-defined distribution: `::from_distribution(...)`. * Add functions to construct a random matrix with a user-defined distribution: `::from_distribution(...)`.
## [0.14.0] ## [0.14.0]
### Modified ### Modified
* Allow the `Isometry * Unit<Vector>` multiplication. * Allow the `Isometry * Unit<Vector>` multiplication.
### Added ### Added
* Add blas-like operations: `.quadform(...)` and `.quadform_tr(...)` to compute respectively * Add blas-like operations: `.quadform(...)` and `.quadform_tr(...)` to compute respectively
the quadratic forms `self = alpha * A.transpose() * B * A + beta * self` and the quadratic forms `self = alpha * A.transpose() * B * A + beta * self` and
`alpha * A * B * A.transpose() + beta * self`. Here, `A, B` are matrices with `alpha * A * B * A.transpose() + beta * self`. Here, `A, B` are matrices with
@ -603,8 +735,6 @@ library (i.e. it supports `#![no_std]`). See the corresponding [documentation](h
`UnitQuaternion::rotation_between_axis(...)` that take Unit vectors instead of `UnitQuaternion::rotation_between_axis(...)` that take Unit vectors instead of
Vector as arguments. Vector as arguments.
## [0.13.0] ## [0.13.0]
The **nalgebra-lapack** crate has been updated. This now includes a broad range The **nalgebra-lapack** crate has been updated. This now includes a broad range
@ -614,6 +744,7 @@ This adds support for serialization using the
[abomonation](https://crates.io/crates/abomonation) crate. [abomonation](https://crates.io/crates/abomonation) crate.
### Breaking semantic change ### Breaking semantic change
* The implementation of slicing with steps now matches the documentation. * The implementation of slicing with steps now matches the documentation.
Before, step identified the number to add to pass from one column/row index Before, step identified the number to add to pass from one column/row index
to the next one. This made 0 step invalid. Now (and on the documentation so to the next one. This made 0 step invalid. Now (and on the documentation so
@ -622,6 +753,7 @@ This adds support for serialization using the
example, a step of, say, 3 on previous versions should now bet set to 2. example, a step of, say, 3 on previous versions should now bet set to 2.
### Modified ### Modified
* The trait `Axpy` has been replaced by a method `.axpy`. * The trait `Axpy` has been replaced by a method `.axpy`.
* The alias `MatrixNM` is now deprecated. Use `MatrixMN` instead (we * The alias `MatrixNM` is now deprecated. Use `MatrixMN` instead (we
reordered M and N to be in alphabetical order). reordered M and N to be in alphabetical order).
@ -631,6 +763,7 @@ This adds support for serialization using the
`.component_div_assign(...)` instead. `.component_div_assign(...)` instead.
### Added ### Added
* `alga::general::Real` is now re-exported by nalgebra. * `alga::general::Real` is now re-exported by nalgebra.
elements.) elements.)
* `::zeros(...)` that creates a matrix filled with zeroes. * `::zeros(...)` that creates a matrix filled with zeroes.
@ -666,17 +799,20 @@ Pure Rust implementation of some Blas operations:
* `.ger_symm(...)` is the same as `.ger` except that `self` is assumed symmetric. * `.ger_symm(...)` is the same as `.ger` except that `self` is assumed symmetric.
New slicing methods: New slicing methods:
* `.rows_range(...)` that retrieves a reference to a range of rows. * `.rows_range(...)` that retrieves a reference to a range of rows.
* `.rows_range_mut(...)` that retrieves a mutable reference to a range of rows. * `.rows_range_mut(...)` that retrieves a mutable reference to a range of rows.
* `.columns_range(...)` that retrieves a reference to a range of columns. * `.columns_range(...)` that retrieves a reference to a range of columns.
* `.columns_range_mut(...)` that retrieves a mutable reference to a range of columns. * `.columns_range_mut(...)` that retrieves a mutable reference to a range of columns.
Matrix decompositions implemented in pure Rust: Matrix decompositions implemented in pure Rust:
* Cholesky, SVD, LU, QR, Hessenberg, Schur, Symmetric eigendecompositions, * Cholesky, SVD, LU, QR, Hessenberg, Schur, Symmetric eigendecompositions,
Bidiagonal, Symmetric tridiagonal Bidiagonal, Symmetric tridiagonal
* Computation of householder reflectors and givens rotations. * Computation of householder reflectors and givens rotations.
Matrix edition: Matrix edition:
* `.upper_triangle()` extracts the upper triangle of a matrix, including the diagonal. * `.upper_triangle()` extracts the upper triangle of a matrix, including the diagonal.
* `.lower_triangle()` extracts the lower triangle of a matrix, including the diagonal. * `.lower_triangle()` extracts the lower triangle of a matrix, including the diagonal.
* `.fill(...)` fills the matrix with a single value. * `.fill(...)` fills the matrix with a single value.
@ -693,37 +829,45 @@ Matrix edition:
* `.swap_columns(...)` swaps two columns. * `.swap_columns(...)` swaps two columns.
Column removal: Column removal:
* `.remove_column(...)` removes one column. * `.remove_column(...)` removes one column.
* `.remove_fixed_columns<D>(...)` removes `D` columns. * `.remove_fixed_columns<D>(...)` removes `D` columns.
* `.remove_columns(...)` removes a number of columns known at run-time. * `.remove_columns(...)` removes a number of columns known at run-time.
Row removal: Row removal:
* `.remove_row(...)` removes one row. * `.remove_row(...)` removes one row.
* `.remove_fixed_rows<D>(...)` removes `D` rows. * `.remove_fixed_rows<D>(...)` removes `D` rows.
* `.remove_rows(...)` removes a number of rows known at run-time. * `.remove_rows(...)` removes a number of rows known at run-time.
Column insertion: Column insertion:
* `.insert_column(...)` adds one column at the given position. * `.insert_column(...)` adds one column at the given position.
* `.insert_fixed_columns<D>(...)` adds `D` columns at the given position. * `.insert_fixed_columns<D>(...)` adds `D` columns at the given position.
* `.insert_columns(...)` adds at the given position a number of columns known at run-time. * `.insert_columns(...)` adds at the given position a number of columns known at run-time.
Row insertion: Row insertion:
* `.insert_row(...)` adds one row at the given position. * `.insert_row(...)` adds one row at the given position.
* `.insert_fixed_rows<D>(...)` adds `D` rows at the given position. * `.insert_fixed_rows<D>(...)` adds `D` rows at the given position.
* `.insert_rows(...)` adds at the given position a number of rows known at run-time. * `.insert_rows(...)` adds at the given position a number of rows known at run-time.
## [0.12.0] ## [0.12.0]
The main change of this release is the update of the dependency serde to 1.0. The main change of this release is the update of the dependency serde to 1.0.
### Added ### Added
* `.trace()` that computes the trace of a matrix (the sum of its diagonal * `.trace()` that computes the trace of a matrix (the sum of its diagonal
elements.) elements.)
## [0.11.0] ## [0.11.0]
The [website](https://nalgebra.org) has been fully rewritten and gives a good The [website](https://nalgebra.org) has been fully rewritten and gives a good
overview of all the added/modified features. overview of all the added/modified features.
This version is a major rewrite of the library. Major changes are: This version is a major rewrite of the library. Major changes are:
* Algebraic traits are now defined by the [alga](https://crates.io/crates/alga) crate. * Algebraic traits are now defined by the [alga](https://crates.io/crates/alga) crate.
All other mathematical traits, except `Axpy` have been removed from All other mathematical traits, except `Axpy` have been removed from
**nalgebra**. **nalgebra**.
@ -741,9 +885,11 @@ This version is a major rewrite of the library. Major changes are:
* Matrix **slices** are now implemented. * Matrix **slices** are now implemented.
### Added ### Added
Lots of features including rectangular matrices, slices, and Serde Lots of features including rectangular matrices, slices, and Serde
serialization. Refer to the brand new [website](https://nalgebra.org) for more serialization. Refer to the brand new [website](https://nalgebra.org) for more
details. The following free-functions have been added as well: details. The following free-functions have been added as well:
* `::id()` that returns the universal [identity element](https://nalgebra.org/performance_tricks/#the-id-type) * `::id()` that returns the universal [identity element](https://nalgebra.org/performance_tricks/#the-id-type)
of type `Id`. of type `Id`.
* `::inf_sup()` that returns both the infimum and supremum of a value at the * `::inf_sup()` that returns both the infimum and supremum of a value at the
@ -753,6 +899,7 @@ details. The following free-functions have been added as well:
the interval width to it. the interval width to it.
### Modified ### Modified
* `::cast` -> `::convert` * `::cast` -> `::convert`
* `point.as_vector()` -> `point.coords` * `point.as_vector()` -> `point.coords`
* `na::origin` -> `P::origin()` * `na::origin` -> `P::origin()`
@ -763,6 +910,7 @@ details. The following free-functions have been added as well:
* `::angle_between` -> `::angle` * `::angle_between` -> `::angle`
Componentwise multiplication and division has been replaced by methods: Componentwise multiplication and division has been replaced by methods:
* multiplication -> `.componentwise_mul`, `.componentwise_mul_mut`. * multiplication -> `.componentwise_mul`, `.componentwise_mul_mut`.
* division -> `.componentwise_div`, `.componentwise_div_mut`. * division -> `.componentwise_div`, `.componentwise_div_mut`.
@ -772,8 +920,8 @@ only:
`.eig`), `::hessenberg`, `::qr`, `::to_homogeneous`, `::to_rotation_matrix`, `.eig`), `::hessenberg`, `::qr`, `::to_homogeneous`, `::to_rotation_matrix`,
`::transpose`, `::shape`. `::transpose`, `::shape`.
The following free-functions are now replaced by static methods only: The following free-functions are now replaced by static methods only:
* `::householder_matrix` under the name `::new_householder_generic` * `::householder_matrix` under the name `::new_householder_generic`
* `::identity` * `::identity`
* `::new_identity` under the name `::identity` * `::new_identity` under the name `::identity`
@ -782,6 +930,7 @@ The following free-functions are now replaced by static methods only:
The following free-function are now replaced methods accessible through traits The following free-function are now replaced methods accessible through traits
only: only:
* `::transform` -> methods `.transform_point` and `.transform_vector` of the `alga::linear::Transformation` trait. * `::transform` -> methods `.transform_point` and `.transform_vector` of the `alga::linear::Transformation` trait.
* `::inverse_transform` -> methods `.inverse_transform_point` and * `::inverse_transform` -> methods `.inverse_transform_point` and
`.inverse_transform_vector` of the `alga::linear::ProjectiveTransformation` `.inverse_transform_vector` of the `alga::linear::ProjectiveTransformation`
@ -798,9 +947,8 @@ only:
`alga::linear::Rotation` trait. `alga::linear::Rotation` trait.
* `::is_zero` -> method with the same name from `num::Zero`. * `::is_zero` -> method with the same name from `num::Zero`.
### Removed ### Removed
* The free functions `::prepend_rotation`, `::append_rotation`, * The free functions `::prepend_rotation`, `::append_rotation`,
`::append_rotation_wrt_center`, `::append_rotation_wrt_point`, `::append_rotation_wrt_center`, `::append_rotation_wrt_point`,
`::append_transformation`, and `::append_translation ` have been removed. `::append_transformation`, and `::append_translation ` have been removed.
@ -824,11 +972,14 @@ only:
`rotation.angle()` and `rotation.axis()`. `rotation.angle()` and `rotation.axis()`.
## [0.10.0] ## [0.10.0]
### Added ### Added
Binary operations are now allowed between references as well. For example Binary operations are now allowed between references as well. For example
`Vector3<f32> + &Vector3<f32>` is now possible. `Vector3<f32> + &Vector3<f32>` is now possible.
### Modified ### Modified
Removed unused parameters to methods from the `ApproxEq` trait. Those were Removed unused parameters to methods from the `ApproxEq` trait. Those were
required before rust 1.0 to help type inference. They are not needed any more required before rust 1.0 to help type inference. They are not needed any more
since it now allowed to write for a type `T` that implements `ApproxEq`: since it now allowed to write for a type `T` that implements `ApproxEq`:
@ -836,7 +987,9 @@ since it now allowed to write for a type `T` that implements `ApproxEq`:
`ApproxEq::approx_epsilon(None::<T>)`. `ApproxEq::approx_epsilon(None::<T>)`.
## [0.9.0] ## [0.9.0]
### Modified ### Modified
* Renamed: * Renamed:
- `::from_col_vector` -> `::from_column_vector` - `::from_col_vector` -> `::from_column_vector`
- `::from_col_iter` -> `::from_column_iter` - `::from_col_iter` -> `::from_column_iter`
@ -858,11 +1011,13 @@ Other similar trait changes are to be expected in the future, e.g., for the
Methods marked `unsafe` for reasons unrelated to memory safety are no Methods marked `unsafe` for reasons unrelated to memory safety are no
longer unsafe. Instead, their name end with `_unchecked`. In particular: longer unsafe. Instead, their name end with `_unchecked`. In particular:
* `Rotation3::new_with_matrix` -> `Rotation3::from_matrix_unchecked` * `Rotation3::new_with_matrix` -> `Rotation3::from_matrix_unchecked`
* `PerspectiveMatrix3::new_with_matrix` -> `PerspectiveMatrix3::from_matrix_unchecked` * `PerspectiveMatrix3::new_with_matrix` -> `PerspectiveMatrix3::from_matrix_unchecked`
* `OrthographicMatrix3::new_with_matrix` -> `OrthographicMatrix3::from_matrix_unchecked` * `OrthographicMatrix3::new_with_matrix` -> `OrthographicMatrix3::from_matrix_unchecked`
### Added ### Added
- A `Unit<T>` type that wraps normalized values. In particular, - A `Unit<T>` type that wraps normalized values. In particular,
`UnitQuaternion<N>` is now an alias for `Unit<Quaternion<N>>`. `UnitQuaternion<N>` is now an alias for `Unit<Quaternion<N>>`.
- `.ln()`, `.exp()` and `.powf(..)` for quaternions and unit quaternions. - `.ln()`, `.exp()` and `.powf(..)` for quaternions and unit quaternions.
@ -879,7 +1034,9 @@ crate for vectors, rotations and points. To enable them, activate the
`abstract_algebra` feature. `abstract_algebra` feature.
## [0.8.0] ## [0.8.0]
### Modified ### Modified
* Almost everything (types, methods, and traits) now use fulls names instead * Almost everything (types, methods, and traits) now use fulls names instead
of abbreviations (e.g. `Vec3` becomes `Vector3`). Most changes are obvious. of abbreviations (e.g. `Vec3` becomes `Vector3`). Most changes are obvious.
Note however that: Note however that:
@ -893,19 +1050,24 @@ crate for vectors, rotations and points. To enable them, activate the
e.g., `vec.rs` becomes `vector.rs`. e.g., `vec.rs` becomes `vector.rs`.
## [0.7.0] ## [0.7.0]
### Added ### Added
* Added implementation of assignment operators (+=, -=, etc.) for * Added implementation of assignment operators (+=, -=, etc.) for
everything. everything.
### Modified ### Modified
* Points and vectors are now linked to each other with associated types * Points and vectors are now linked to each other with associated types
(on the PointAsVector trait). (on the PointAsVector trait).
## [0.6.0] ## [0.6.0]
**Announcement:** a users forum has been created for `nalgebra`, `ncollide`, and `nphysics`. See **Announcement:** a users forum has been created for `nalgebra`, `ncollide`, and `nphysics`. See
you [there](https://users.nphysics.org)! you [there](https://users.nphysics.org)!
### Added ### Added
* Added a dependency to [generic-array](https://crates.io/crates/generic-array). Feature-gated: * Added a dependency to [generic-array](https://crates.io/crates/generic-array). Feature-gated:
requires `features="generic_sizes"`. requires `features="generic_sizes"`.
* Added statically sized vectors with user-defined sizes: `VectorN`. Feature-gated: requires * Added statically sized vectors with user-defined sizes: `VectorN`. Feature-gated: requires
@ -914,10 +1076,13 @@ you [there](https://users.nphysics.org)!
translation): `Similarity2`, `Similarity3`. translation): `Similarity2`, `Similarity3`.
### Removed ### Removed
* Removed zero-sized elements `Vector0`, `Point0`. * Removed zero-sized elements `Vector0`, `Point0`.
* Removed 4-dimensional transformations `Rotation4` and `Isometry4` (which had an implementation too incomplete to be useful). * Removed 4-dimensional transformations `Rotation4` and `Isometry4` (which had an implementation too incomplete to be
useful).
### Modified ### Modified
* Vectors are now multipliable with isometries. This will result into a pure rotation (this is how * Vectors are now multipliable with isometries. This will result into a pure rotation (this is how
vectors differ from point semantically: they design directions, so they are not translatable). vectors differ from point semantically: they design directions, so they are not translatable).
* `{Isometry3, Rotation3}::look_at` reimplemented and renamed to `::look_at_rh` and `::look_at_lh` to agree * `{Isometry3, Rotation3}::look_at` reimplemented and renamed to `::look_at_rh` and `::look_at_lh` to agree