本文整理汇总了C++中Permutation::PermuteRows方法的典型用法代码示例。如果您正苦于以下问题:C++ Permutation::PermuteRows方法的具体用法?C++ Permutation::PermuteRows怎么用?C++ Permutation::PermuteRows使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Permutation
的用法示例。
在下文中一共展示了Permutation::PermuteRows方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: w
void LUMod
( Matrix<F>& A,
Permutation& P,
const Matrix<F>& u,
const Matrix<F>& v,
bool conjugate,
Base<F> tau )
{
DEBUG_CSE
typedef Base<F> Real;
const Int m = A.Height();
const Int n = A.Width();
const Int minDim = Min(m,n);
if( minDim != m )
LogicError("It is assumed that height(A) <= width(A)");
if( u.Height() != m || u.Width() != 1 )
LogicError("u is expected to be a conforming column vector");
if( v.Height() != n || v.Width() != 1 )
LogicError("v is expected to be a conforming column vector");
// w := inv(L) P u
auto w( u );
P.PermuteRows( w );
Trsv( LOWER, NORMAL, UNIT, A, w );
// Maintain an external vector for the temporary subdiagonal of U
Matrix<F> uSub;
Zeros( uSub, minDim-1, 1 );
// Reduce w to a multiple of e0
for( Int i=minDim-2; i>=0; --i )
{
// Decide if we should pivot the i'th and i+1'th rows of w
const F lambdaSub = A(i+1,i);
const F ups_ii = A(i,i);
const F omega_i = w(i);
const F omega_ip1 = w(i+1);
const Real rightTerm = Abs(lambdaSub*omega_i+omega_ip1);
const bool pivot = ( Abs(omega_i) < tau*rightTerm );
const Range<Int> indi( i, i+1 ),
indip1( i+1, i+2 ),
indB( i+2, m ),
indR( i+1, n );
auto lBi = A( indB, indi );
auto lBip1 = A( indB, indip1 );
auto uiR = A( indi, indR );
auto uip1R = A( indip1, indR );
if( pivot )
{
// P := P_i P
P.Swap( i, i+1 );
// Simultaneously perform
// U := P_i U and
// L := P_i L P_i^T
//
// Then update
// L := L T_{i,L}^{-1},
// U := T_{i,L} U,
// w := T_{i,L} P_i w,
// where T_{i,L} is the Gauss transform which zeros (P_i w)_{i+1}.
//
// More succinctly,
// gamma := w(i) / w(i+1),
// w(i) := w(i+1),
// w(i+1) := 0,
// L(:,i) += gamma L(:,i+1),
// U(i+1,:) -= gamma U(i,:).
const F gamma = omega_i / omega_ip1;
const F lambda_ii = F(1) + gamma*lambdaSub;
A(i, i) = gamma;
A(i+1,i) = 0;
auto lBiCopy = lBi;
Swap( NORMAL, lBi, lBip1 );
Axpy( gamma, lBiCopy, lBi );
auto uip1RCopy = uip1R;
RowSwap( A, i, i+1 );
Axpy( -gamma, uip1RCopy, uip1R );
// Force L back to *unit* lower-triangular form via the transform
// L := L T_{i,U}^{-1} D^{-1},
// where D is diagonal and responsible for forcing L(i,i) and
// L(i+1,i+1) back to 1. The effect on L is:
// eta := L(i,i+1)/L(i,i),
// L(:,i+1) -= eta L(:,i),
// delta_i := L(i,i),
// delta_ip1 := L(i+1,i+1),
// L(:,i) /= delta_i,
// L(:,i+1) /= delta_ip1,
// while the effect on U is
// U(i,:) += eta U(i+1,:)
// U(i,:) *= delta_i,
// U(i+1,:) *= delta_{i+1},
// and the effect on w is
// w(i) *= delta_i.
//.........这里部分代码省略.........
示例2: Mod
//.........这里部分代码省略.........
Real scale = Max( 2*Abs(beta), MaxNorm(d) );
SafeScale( Real(1), scale, d );
SafeScale( Real(1), scale, beta );
// Now that the problem is rescaled, our deflation tolerance simplifies to
//
// tol = deflationFudge eps max( || d ||_max, 2*|beta| )
// = deflationFudge eps.
//
// Cf. LAPACK's {s,d}lasd2 [CITATION] for this tolerance.
const Real eps = limits::Epsilon<Real>();
const Real deflationTol = dcCtrl.deflationFudge*eps;
Matrix<Real> z(n,1);
Matrix<Int> columnTypes(n,1);
const Real betaSgn = Sgn( beta, false );
const Int lastRowOfQ0 = ( ctrl.wantEigVecs ? n0-1 : 0 );
const Real sqrtTwo = Sqrt( Real(2) );
z(0) = betaSgn*Q0(lastRowOfQ0,n0-1) / sqrtTwo;
columnTypes(0) = DENSE_COLUMN;
for( Int j=0; j<n0-1; ++j )
{
z(j+1) = betaSgn*Q0(lastRowOfQ0,j) / sqrtTwo;
columnTypes(j+1) = COLUMN_NONZERO_IN_FIRST_BLOCK;
}
for( Int j=0; j<n1; ++j )
{
z(j+n0) = Q1(0,j) / sqrtTwo;
columnTypes(j+n0) = COLUMN_NONZERO_IN_SECOND_BLOCK;
}
Permutation combineSortPerm;
SortingPermutation( d, combineSortPerm, ASCENDING );
combineSortPerm.PermuteRows( d );
combineSortPerm.PermuteRows( z );
combineSortPerm.PermuteRows( columnTypes );
auto combinedToOrig = [&]( const Int& combinedIndex )
{
const Int preCombined = combineSortPerm.Preimage( combinedIndex );
if( preCombined < n0 )
// Undo the cyclic shift [0,n0) |-> [1,n0+1) mod n0 which
// pushed the removed row into the first position.
return Mod( preCombined-1, n0 );
else
return preCombined;
};
Permutation deflationPerm;
deflationPerm.MakeIdentity( n );
deflationPerm.MakeArbitrary();
// Since we do not yet know how many undeflated entries there will be, we
// must use the no-deflation case as our storage upper bound.
Matrix<Real> dUndeflated(n,1), zUndeflated(n,1);
dUndeflated(0) = 0;
zUndeflated(0) = z(0);
// Deflate all (off-diagonal) update entries sufficiently close to zero
Int numDeflated = 0;
Int numUndeflated = 0;
// We will keep track of the last column that we encountered that was not
// initially deflatable (but that could be deflated later due to close
// diagonal entries if another undeflatable column is not encountered
// first).
Int revivalCandidate = n;
for( Int j=0; j<n; ++j )