本文整理汇总了C++中DistMatrix::GetRealPartOfDiagonal方法的典型用法代码示例。如果您正苦于以下问题:C++ DistMatrix::GetRealPartOfDiagonal方法的具体用法?C++ DistMatrix::GetRealPartOfDiagonal怎么用?C++ DistMatrix::GetRealPartOfDiagonal使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类DistMatrix
的用法示例。
在下文中一共展示了DistMatrix::GetRealPartOfDiagonal方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: PushCallStack
inline void
SimpleSingularValuesUpper
( DistMatrix<Complex<Real> >& A,
DistMatrix<Real,VR,STAR>& s )
{
#ifndef RELEASE
PushCallStack("svd::SimpleSingularValuesUpper");
#endif
typedef Complex<Real> C;
const int m = A.Height();
const int n = A.Width();
const int k = std::min( m, n );
const int offdiagonal = ( m>=n ? 1 : -1 );
const char uplo = ( m>=n ? 'U' : 'L' );
const Grid& g = A.Grid();
// Bidiagonalize A
DistMatrix<C,STAR,STAR> tP(g), tQ(g);
Bidiag( A, tP, tQ );
// Grab copies of the diagonal and sub/super-diagonal of A
DistMatrix<Real,MD,STAR> d_MD_STAR( g ),
e_MD_STAR( g );
A.GetRealPartOfDiagonal( d_MD_STAR );
A.GetRealPartOfDiagonal( e_MD_STAR, offdiagonal );
// In order to use serial QR kernels, we need the full bidiagonal matrix
// on each process
//
// NOTE: lapack::BidiagQRAlg expects e to be of length k
DistMatrix<Real,STAR,STAR> d_STAR_STAR( d_MD_STAR );
DistMatrix<Real,STAR,STAR> eHat_STAR_STAR( k, 1, g );
DistMatrix<Real,STAR,STAR> e_STAR_STAR( g );
e_STAR_STAR.View( eHat_STAR_STAR, 0, 0, k-1, 1 );
e_STAR_STAR = e_MD_STAR;
// Compute the singular values of the bidiagonal matrix
lapack::BidiagQRAlg
( uplo, k, 0, 0,
d_STAR_STAR.LocalBuffer(), e_STAR_STAR.LocalBuffer(),
(C*)0, 1, (C*)0, 1 );
// Copy out the appropriate subset of the singular values
s = d_STAR_STAR;
#ifndef RELEASE
PopCallStack();
#endif
}
示例2: entry
inline void
GolubReinschUpper
( DistMatrix<F>& A,
DistMatrix<BASE(F),VR,STAR>& s )
{
#ifndef RELEASE
CallStackEntry entry("svd::GolubReinschUpper");
#endif
typedef BASE(F) Real;
const Int m = A.Height();
const Int n = A.Width();
const Int k = Min( m, n );
const Int offdiagonal = ( m>=n ? 1 : -1 );
const Grid& g = A.Grid();
// Bidiagonalize A
DistMatrix<F,STAR,STAR> tP(g), tQ(g);
Bidiag( A, tP, tQ );
// Grab copies of the diagonal and sub/super-diagonal of A
DistMatrix<Real,MD,STAR> d_MD_STAR(g), e_MD_STAR(g);
A.GetRealPartOfDiagonal( d_MD_STAR );
A.GetRealPartOfDiagonal( e_MD_STAR, offdiagonal );
// In order to use serial DQDS kernels, we need the full bidiagonal matrix
// on each process
//
// NOTE: lapack::BidiagDQDS expects e to be of length k
DistMatrix<Real,STAR,STAR> d_STAR_STAR( d_MD_STAR ),
eHat_STAR_STAR( k, 1, g ),
e_STAR_STAR( g );
View( e_STAR_STAR, eHat_STAR_STAR, 0, 0, k-1, 1 );
e_STAR_STAR = e_MD_STAR;
// Compute the singular values of the bidiagonal matrix via DQDS
lapack::BidiagDQDS( k, d_STAR_STAR.Buffer(), e_STAR_STAR.Buffer() );
// Copy out the appropriate subset of the singular values
s = d_STAR_STAR;
}
示例3: HermitianInfinityNorm
void TestCorrectness
( UpperOrLower uplo,
const DistMatrix<F>& A,
const DistMatrix<F,STAR,STAR>& t,
DistMatrix<F>& AOrig,
bool print, bool display )
{
typedef Base<F> Real;
const Grid& g = A.Grid();
const Int m = AOrig.Height();
const Real infNormAOrig = HermitianInfinityNorm( uplo, AOrig );
const Real frobNormAOrig = HermitianFrobeniusNorm( uplo, AOrig );
if( g.Rank() == 0 )
cout << "Testing error..." << endl;
// Grab the diagonal and subdiagonal of the symmetric tridiagonal matrix
Int subdiagonal = ( uplo==LOWER ? -1 : +1 );
auto d = A.GetRealPartOfDiagonal();
auto e = A.GetRealPartOfDiagonal( subdiagonal );
// Grab a full copy of e so that we may fill the opposite subdiagonal
DistMatrix<Real,STAR,STAR> e_STAR_STAR( e );
DistMatrix<Real,MD,STAR> eOpposite(g);
A.ForceDiagonalAlign( eOpposite, -subdiagonal );
eOpposite = e_STAR_STAR;
// Zero B and then fill its tridiagonal
DistMatrix<F> B(g);
B.AlignWith( A );
Zeros( B, m, m );
B.SetRealPartOfDiagonal( d );
B.SetRealPartOfDiagonal( e, subdiagonal );
B.SetRealPartOfDiagonal( eOpposite, -subdiagonal );
if( print )
Print( B, "Tridiagonal" );
if( display )
Display( B, "Tridiagonal" );
// Reverse the accumulated Householder transforms, ignoring symmetry
herm_tridiag::ApplyQ( LEFT, uplo, NORMAL, A, t, B );
herm_tridiag::ApplyQ( RIGHT, uplo, ADJOINT, A, t, B );
if( print )
Print( B, "Rotated tridiagonal" );
if( display )
Display( B, "Rotated tridiagonal" );
// Compare the appropriate triangle of AOrig and B
MakeTriangular( uplo, AOrig );
MakeTriangular( uplo, B );
Axpy( F(-1), AOrig, B );
if( print )
Print( B, "Error in rotated tridiagonal" );
if( display )
Display( B, "Error in rotated tridiagonal" );
const Real infNormError = HermitianInfinityNorm( uplo, B );
const Real frobNormError = HermitianFrobeniusNorm( uplo, B );
// Compute || I - Q Q^H ||
MakeIdentity( B );
herm_tridiag::ApplyQ( RIGHT, uplo, ADJOINT, A, t, B );
DistMatrix<F> QHAdj( g );
Adjoint( B, QHAdj );
MakeIdentity( B );
herm_tridiag::ApplyQ( LEFT, uplo, NORMAL, A, t, B );
Axpy( F(-1), B, QHAdj );
herm_tridiag::ApplyQ( RIGHT, uplo, ADJOINT, A, t, B );
UpdateDiagonal( B, F(-1) );
const Real infNormQError = InfinityNorm( B );
const Real frobNormQError = FrobeniusNorm( B );
if( g.Rank() == 0 )
{
cout << " ||A||_oo = " << infNormAOrig << "\n"
<< " ||A||_F = " << frobNormAOrig << "\n"
<< " || I - Q^H Q ||_oo = " << infNormQError << "\n"
<< " || I - Q^H Q ||_F = " << frobNormQError << "\n"
<< " ||A - Q T Q^H||_oo = " << infNormError << "\n"
<< " ||A - Q T Q^H||_F = " << frobNormError << endl;
}
}
示例4: BASE
void TestCorrectness
( bool print,
UpperOrLower uplo,
const DistMatrix<F>& A,
const DistMatrix<F,STAR,STAR>& t,
DistMatrix<F>& AOrig )
{
typedef BASE(F) Real;
const Grid& g = A.Grid();
const Int m = AOrig.Height();
Int subdiagonal = ( uplo==LOWER ? -1 : +1 );
if( g.Rank() == 0 )
cout << "Testing error..." << endl;
// Grab the diagonal and subdiagonal of the symmetric tridiagonal matrix
DistMatrix<Real,MD,STAR> d(g);
DistMatrix<Real,MD,STAR> e(g);
A.GetRealPartOfDiagonal( d );
A.GetRealPartOfDiagonal( e, subdiagonal );
// Grab a full copy of e so that we may fill the opposite subdiagonal
DistMatrix<Real,STAR,STAR> e_STAR_STAR(g);
DistMatrix<Real,MD,STAR> eOpposite(g);
e_STAR_STAR = e;
eOpposite.AlignWithDiagonal( A.DistData(), -subdiagonal );
eOpposite = e_STAR_STAR;
// Zero B and then fill its tridiagonal
DistMatrix<F> B(g);
B.AlignWith( A );
Zeros( B, m, m );
B.SetRealPartOfDiagonal( d );
B.SetRealPartOfDiagonal( e, subdiagonal );
B.SetRealPartOfDiagonal( eOpposite, -subdiagonal );
if( print )
Print( B, "Tridiagonal" );
// Reverse the accumulated Householder transforms, ignoring symmetry
hermitian_tridiag::ApplyQ( LEFT, uplo, NORMAL, A, t, B );
hermitian_tridiag::ApplyQ( RIGHT, uplo, ADJOINT, A, t, B );
if( print )
Print( B, "Rotated tridiagonal" );
// Compare the appropriate triangle of AOrig and B
MakeTriangular( uplo, AOrig );
MakeTriangular( uplo, B );
Axpy( F(-1), AOrig, B );
if( print )
Print( B, "Error in rotated tridiagonal" );
const Real infNormOfAOrig = HermitianInfinityNorm( uplo, AOrig );
const Real frobNormOfAOrig = HermitianFrobeniusNorm( uplo, AOrig );
const Real infNormOfError = HermitianInfinityNorm( uplo, B );
const Real frobNormOfError = HermitianFrobeniusNorm( uplo, B );
if( g.Rank() == 0 )
{
cout << " ||AOrig||_1 = ||AOrig||_oo = " << infNormOfAOrig << "\n"
<< " ||AOrig||_F = " << frobNormOfAOrig << "\n"
<< " ||AOrig - Q^H A Q||_oo = " << infNormOfError << "\n"
<< " ||AOrig - Q^H A Q||_F = " << frobNormOfError << endl;
}
}
示例5: d
void TestCorrectness
( bool print,
UpperOrLower uplo,
const DistMatrix<Complex<R> >& A,
const DistMatrix<Complex<R>,STAR,STAR>& t,
DistMatrix<Complex<R> >& AOrig )
{
typedef Complex<R> C;
const Grid& g = A.Grid();
const int m = AOrig.Height();
int subdiagonal = ( uplo==LOWER ? -1 : +1 );
if( g.Rank() == 0 )
cout << "Testing error..." << endl;
// Grab the diagonal and subdiagonal of the symmetric tridiagonal matrix
DistMatrix<R,MD,STAR> d(g);
DistMatrix<R,MD,STAR> e(g);
A.GetRealPartOfDiagonal( d );
A.GetRealPartOfDiagonal( e, subdiagonal );
// Grab a full copy of e so that we may fill the opposite subdiagonal
DistMatrix<R,STAR,STAR> e_STAR_STAR(g);
DistMatrix<R,MD,STAR> eOpposite(g);
e_STAR_STAR = e;
eOpposite.AlignWithDiagonal( A, -subdiagonal );
eOpposite = e_STAR_STAR;
// Zero B and then fill its tridiagonal
DistMatrix<C> B(g);
B.AlignWith( A );
Zeros( m, m, B );
B.SetRealPartOfDiagonal( d );
B.SetRealPartOfDiagonal( e, subdiagonal );
B.SetRealPartOfDiagonal( eOpposite, -subdiagonal );
// Reverse the accumulated Householder transforms, ignoring symmetry
if( uplo == LOWER )
{
ApplyPackedReflectors
( LEFT, LOWER, VERTICAL, BACKWARD,
UNCONJUGATED, subdiagonal, A, t, B );
ApplyPackedReflectors
( RIGHT, LOWER, VERTICAL, BACKWARD,
CONJUGATED, subdiagonal, A, t, B );
}
else
{
ApplyPackedReflectors
( LEFT, UPPER, VERTICAL, FORWARD,
UNCONJUGATED, subdiagonal, A, t, B );
ApplyPackedReflectors
( RIGHT, UPPER, VERTICAL, FORWARD,
CONJUGATED, subdiagonal, A, t, B );
}
// Compare the appropriate triangle of AOrig and B
MakeTriangular( uplo, AOrig );
MakeTriangular( uplo, B );
Axpy( C(-1), AOrig, B );
const R infNormOfAOrig = HermitianNorm( uplo, AOrig, INFINITY_NORM );
const R frobNormOfAOrig = HermitianNorm( uplo, AOrig, FROBENIUS_NORM );
const R infNormOfError = HermitianNorm( uplo, B, INFINITY_NORM );
const R frobNormOfError = HermitianNorm( uplo, B, FROBENIUS_NORM );
if( g.Rank() == 0 )
{
cout << " ||AOrig||_1 = ||AOrig||_oo = " << infNormOfAOrig << "\n"
<< " ||AOrig||_F = " << frobNormOfAOrig << "\n"
<< " ||AOrig - Q^H A Q||_oo = " << infNormOfError << "\n"
<< " ||AOrig - Q^H A Q||_F = " << frobNormOfError << endl;
}
}