diff options
author | 2009-07-26 13:53:24 +0200 | |
---|---|---|
committer | 2009-07-26 13:53:24 +0200 | |
commit | 1d4d9a37fd2b60d13f1bd520ab2ebebf18882b4e (patch) | |
tree | 9b4702c974ba573f0eed1425d822979309a71a6b /Eigen/src/Core/SolveTriangular.h | |
parent | f3fde74695eff236fe24b05ffb053d3890346420 (diff) |
some cleaning
Diffstat (limited to 'Eigen/src/Core/SolveTriangular.h')
-rw-r--r-- | Eigen/src/Core/SolveTriangular.h | 121 |
1 files changed, 56 insertions, 65 deletions
diff --git a/Eigen/src/Core/SolveTriangular.h b/Eigen/src/Core/SolveTriangular.h index d0656eacb..99cf79821 100644 --- a/Eigen/src/Core/SolveTriangular.h +++ b/Eigen/src/Core/SolveTriangular.h @@ -50,41 +50,38 @@ struct ei_triangular_solver_selector<Lhs,Rhs,Mode,NoUnrolling,RowMajor,1> const ActualLhsType& actualLhs = LhsProductTraits::extract(lhs); const int size = lhs.cols(); - for(int c=0 ; c<other.cols() ; ++c) + for(int pi=IsLowerTriangular ? 0 : size; + IsLowerTriangular ? pi<size : pi>0; + IsLowerTriangular ? pi+=PanelWidth : pi-=PanelWidth) { - for(int pi=IsLowerTriangular ? 0 : size; - IsLowerTriangular ? pi<size : pi>0; - IsLowerTriangular ? pi+=PanelWidth : pi-=PanelWidth) + int actualPanelWidth = std::min(IsLowerTriangular ? size - pi : pi, PanelWidth); + + int r = IsLowerTriangular ? pi : size - pi; // remaining size + if (r > 0) { - int actualPanelWidth = std::min(IsLowerTriangular ? size - pi : pi, PanelWidth); + // let's directly call the low level product function because: + // 1 - it is faster to compile + // 2 - it is slighlty faster at runtime + int startRow = IsLowerTriangular ? pi : pi-actualPanelWidth; + int startCol = IsLowerTriangular ? 0 : pi; + VectorBlock<Rhs,Dynamic> target(other,startRow,actualPanelWidth); - int r = IsLowerTriangular ? pi : size - pi; // remaining size - if (r > 0) - { - // let's directly call the low level product function because: - // 1 - it is faster to compile - // 2 - it is slighlty faster at runtime - int startRow = IsLowerTriangular ? pi : pi-actualPanelWidth; - int startCol = IsLowerTriangular ? 0 : pi; - Block<Rhs,Dynamic,1> target(other,startRow,c,actualPanelWidth,1); + ei_cache_friendly_product_rowmajor_times_vector<LhsProductTraits::NeedToConjugate,false>( + &(actualLhs.const_cast_derived().coeffRef(startRow,startCol)), actualLhs.stride(), + &(other.coeffRef(startCol)), r, + target, Scalar(-1)); + } - ei_cache_friendly_product_rowmajor_times_vector<LhsProductTraits::NeedToConjugate,false>( - &(actualLhs.const_cast_derived().coeffRef(startRow,startCol)), actualLhs.stride(), - &(other.coeffRef(startCol, c)), r, - target, Scalar(-1)); - } + for(int k=0; k<actualPanelWidth; ++k) + { + int i = IsLowerTriangular ? pi+k : pi-k-1; + int s = IsLowerTriangular ? pi : i+1; + if (k>0) + other.coeffRef(i) -= ((lhs.row(i).segment(s,k).transpose()) + .cwise()*(other.segment(s,k))).sum(); - for(int k=0; k<actualPanelWidth; ++k) - { - int i = IsLowerTriangular ? pi+k : pi-k-1; - int s = IsLowerTriangular ? pi : i+1; - if (k>0) - other.coeffRef(i,c) -= ((lhs.row(i).segment(s,k).transpose()) - .cwise()*(other.col(c).segment(s,k))).sum(); - - if(!(Mode & UnitDiagBit)) - other.coeffRef(i,c) /= lhs.coeff(i,i); - } + if(!(Mode & UnitDiagBit)) + other.coeffRef(i) /= lhs.coeff(i,i); } } } @@ -107,45 +104,39 @@ struct ei_triangular_solver_selector<Lhs,Rhs,Mode,NoUnrolling,ColMajor,1> { static const int PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH; const ActualLhsType& actualLhs = LhsProductTraits::extract(lhs); - + const int size = lhs.cols(); - for(int c=0 ; c<other.cols() ; ++c) + for(int pi=IsLowerTriangular ? 0 : size; + IsLowerTriangular ? pi<size : pi>0; + IsLowerTriangular ? pi+=PanelWidth : pi-=PanelWidth) { - for(int pi=IsLowerTriangular ? 0 : size; - IsLowerTriangular ? pi<size : pi>0; - IsLowerTriangular ? pi+=PanelWidth : pi-=PanelWidth) - { - int actualPanelWidth = std::min(IsLowerTriangular ? size - pi : pi, PanelWidth); - int startBlock = IsLowerTriangular ? pi : pi-actualPanelWidth; - int endBlock = IsLowerTriangular ? pi + actualPanelWidth : 0; + int actualPanelWidth = std::min(IsLowerTriangular ? size - pi : pi, PanelWidth); + int startBlock = IsLowerTriangular ? pi : pi-actualPanelWidth; + int endBlock = IsLowerTriangular ? pi + actualPanelWidth : 0; - for(int k=0; k<actualPanelWidth; ++k) - { - int i = IsLowerTriangular ? pi+k : pi-k-1; - if(!(Mode & UnitDiagBit)) - other.coeffRef(i,c) /= lhs.coeff(i,i); + for(int k=0; k<actualPanelWidth; ++k) + { + int i = IsLowerTriangular ? pi+k : pi-k-1; + if(!(Mode & UnitDiagBit)) + other.coeffRef(i) /= lhs.coeff(i,i); - int r = actualPanelWidth - k - 1; // remaining size - if (r>0) - { - other.col(c).segment((IsLowerTriangular ? i+1 : i-r), r) -= - other.coeffRef(i,c) - * Block<Lhs,Dynamic,1>(lhs, (IsLowerTriangular ? i+1 : i-r), i, r, 1); - } - } - int r = IsLowerTriangular ? size - endBlock : startBlock; // remaining size - if (r > 0) - { - // let's directly call the low level product function because: - // 1 - it is faster to compile - // 2 - it is slighlty faster at runtime - ei_cache_friendly_product_colmajor_times_vector<LhsProductTraits::NeedToConjugate,false>( - r, - &(actualLhs.const_cast_derived().coeffRef(endBlock,startBlock)), actualLhs.stride(), - other.col(c).segment(startBlock, actualPanelWidth), - &(other.coeffRef(endBlock, c)), - Scalar(-1)); - } + int r = actualPanelWidth - k - 1; // remaining size + int s = IsLowerTriangular ? i+1 : i-r; + if (r>0) + other.segment(s,r) -= other.coeffRef(i) * Block<Lhs,Dynamic,1>(lhs, s, i, r, 1); + } + int r = IsLowerTriangular ? size - endBlock : startBlock; // remaining size + if (r > 0) + { + // let's directly call the low level product function because: + // 1 - it is faster to compile + // 2 - it is slighlty faster at runtime + ei_cache_friendly_product_colmajor_times_vector<LhsProductTraits::NeedToConjugate,false>( + r, + &(actualLhs.const_cast_derived().coeffRef(endBlock,startBlock)), actualLhs.stride(), + other.segment(startBlock, actualPanelWidth), + &(other.coeffRef(endBlock, 0)), + Scalar(-1)); } } } |