From ede0d9b503d826eb3683783cb1b1a587ee540110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 4 Feb 2013 18:41:56 +0100 Subject: [PATCH] Math: generalize Gram-Schmidt algorithm for non-square matrices. --- src/Math/Algorithms/GramSchmidt.h | 15 ++++++++------- src/Math/Algorithms/Test/GramSchmidtTest.cpp | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Math/Algorithms/GramSchmidt.h b/src/Math/Algorithms/GramSchmidt.h index cbaa3d04c..c6f60e2f5 100644 --- a/src/Math/Algorithms/GramSchmidt.h +++ b/src/Math/Algorithms/GramSchmidt.h @@ -19,29 +19,30 @@ * @brief Function Magnum::Math::Algorithms::gramSchmidtInPlace(), Magnum::Math::Algorithms::gramSchmidt() */ -#include "Math/Matrix.h" +#include "Math/RectangularMatrix.h" namespace Magnum { namespace Math { namespace Algorithms { /** -@brief Gram-schmidt matrix orthonormalization +@brief Gram-Schmidt matrix orthonormalization @param[in,out] matrix Matrix to perform orthonormalization on */ -template void gramSchmidtInPlace(Matrix& matrix) { - for(std::size_t i = 0; i != size; ++i) { +template void gramSchmidtInPlace(RectangularMatrix& matrix) { + static_assert(cols <= rows, "Unsupported matrix aspect ratio"); + for(std::size_t i = 0; i != cols; ++i) { matrix[i] = matrix[i].normalized(); - for(std::size_t j = i+1; j != size; ++j) + for(std::size_t j = i+1; j != cols; ++j) matrix[j] -= matrix[j].projected(matrix[i]); } } /** -@brief Gram-schmidt matrix orthonormalization +@brief Gram-Schmidt matrix orthonormalization Unlike gramSchmidtInPlace() returns the modified matrix instead of performing the orthonormalization in-place. */ -template Matrix gramSchmidt(Matrix matrix) { +template RectangularMatrix gramSchmidt(RectangularMatrix matrix) { gramSchmidtInPlace(matrix); return matrix; } diff --git a/src/Math/Algorithms/Test/GramSchmidtTest.cpp b/src/Math/Algorithms/Test/GramSchmidtTest.cpp index 528c6b82f..3313c3ac8 100644 --- a/src/Math/Algorithms/Test/GramSchmidtTest.cpp +++ b/src/Math/Algorithms/Test/GramSchmidtTest.cpp @@ -26,7 +26,7 @@ class GramSchmidtTest: public Corrade::TestSuite::Tester { void test(); }; -typedef Matrix<3, float> Matrix3; +typedef RectangularMatrix<3, 3, float> Matrix3; typedef Vector<3, float> Vector3; GramSchmidtTest::GramSchmidtTest() {