27 #ifndef _nmrSVDEconomy_h
28 #define _nmrSVDEconomy_h
182 if (allocateOutput) {
200 if (allocateWorkspace) {
216 template <
typename _matrixOwnerTypeU,
217 typename _vectorOwnerTypeS,
218 typename _matrixOwnerTypeVt>
222 throw(std::runtime_error)
226 if ((inU.rows() !=
MMember ) || (inU.cols() != minmn)) {
227 cmnThrow(std::runtime_error(
"nmrSVDEconomyDynamicData: Size of matrix U is incorrect."));
230 cmnThrow(std::runtime_error(
"nmrSVDEconomyDynamicData: Storage order of U is incorrect."));
232 if (!inU.IsCompact()) {
233 cmnThrow(std::runtime_error(
"nmrSVDEconomyDynamicData: Matrix U must be compact."));
235 if (! inVt.IsSquare(
NMember)) {
236 cmnThrow(std::runtime_error(
"nmrSVDEconomyDynamicData: Size of matrix Vt is incorrect."));
239 cmnThrow(std::runtime_error(
"nmrSVDEconomyDynamicData: Storage order of Vt is incorrect."));
241 if (!inVt.IsCompact()) {
242 cmnThrow(std::runtime_error(
"nmrSVDEconomyDynamicData: Matrix Vt must be compact."));
244 if (minmn != inS.size()) {
245 cmnThrow(std::runtime_error(
"nmrSVDEconomyDynamicData: Size of vector S is incorrect."));
247 if (!inS.IsCompact()) {
248 cmnThrow(std::runtime_error(
"nmrSVDEconomyDynamicData: Vector S must be compact."));
260 template <
typename _vectorOwnerTypeWorkspace>
263 throw(std::runtime_error)
266 if (lwork > inWorkspace.size()) {
267 cmnThrow(std::runtime_error(
"nmrSVDEconomyDynamicData: Workspace is too small."));
269 if (!inWorkspace.IsCompact()) {
270 cmnThrow(std::runtime_error(
"nmrSVDEconomyDynamicData: Workspace must be compact."));
286 const size_type lwork_1 = 3 * minmn + maxmn;
288 return (lwork_1 > lwork_2) ? lwork_1 : lwork_2;
296 template <
class _matrixOwnerTypeA>
310 template <
class _matrixOwnerTypeA>
327 template <
class _matrixOwnerTypeA,
class _matrixOwnerTypeS,
class _vectorOwnerTypeS>
333 throw(std::runtime_error)
335 const size_type minmn = (A.rows() < A.cols()) ? A.rows() : A.cols();
336 if ((minmn != matrixS.rows()) || (minmn != matrixS.cols())) {
337 cmnThrow(std::runtime_error(
"nmrSVDEconomyDynamicData::UpdateMatrixS: Size of matrix S is incorrect."));
340 matrixS.Diagonal().Assign(vectorS);
430 template <
class _matrixOwnerTypeA>
450 template <
class _matrixOwnerTypeA,
class _vectorOwnerTypeWorkspace>
471 template <
typename _matrixOwnerTypeU,
472 typename _vectorOwnerTypeS,
473 typename _matrixOwnerTypeVt,
474 typename _vectorOwnerTypeWorkspace>
480 this->
SetRef(inU, inS, inVt, inWorkspace);
493 template <
typename _matrixOwnerTypeU,
494 typename _vectorOwnerTypeS,
495 typename _matrixOwnerTypeVt>
514 template <
class _matrixOwnerTypeA>
531 template <
class _matrixOwnerTypeA,
class _vectorOwnerTypeWorkspace>
573 template <
typename _matrixOwnerTypeU,
574 typename _vectorOwnerTypeS,
575 typename _matrixOwnerTypeVt,
576 typename _vectorOwnerTypeWorkspace>
581 throw(std::runtime_error)
583 this->
SetDimension(inU.rows(), inVt.rows(), inU.StorageOrder());
603 template <
typename _matrixOwnerTypeU,
604 typename _vectorOwnerTypeS,
typename _matrixOwnerTypeVt>
608 throw(std::runtime_error)
610 this->
SetDimension(inU.rows(), inVt.rows(), inU.StorageOrder());
800 template <
class _matrixOwnerType>
803 throw (std::runtime_error)
806 CISSTNETLIB_INTEGER Info;
813 cmnThrow(std::runtime_error(
"nmrSVDEconomy: Storage order used for Allocate was different"));
816 if ((dataFriend.
M() != A.rows()) || (dataFriend.
N() != A.cols())) {
817 cmnThrow(std::runtime_error(
"nmrSVDEconomy: Size used for Allocate was different"));
820 if (! A.IsCompact()) {
821 cmnThrow(std::runtime_error(
"nmrSVDEconomy: Requires a compact matrix"));
825 CISSTNETLIB_DOUBLE *UPtr, *VtPtr;
826 CISSTNETLIB_INTEGER m_Lda, m_Ldu, m_Ldvt;
828 if (A.IsColMajor()) {
829 m_Lda = (1 > dataFriend.
M()) ? 1 : dataFriend.
M();
830 m_Ldu = dataFriend.
M();
831 m_Ldvt = dataFriend.
N();
835 m_Lda = (1 > dataFriend.
N()) ? 1 : dataFriend.
N();
836 m_Ldu = dataFriend.
N();
837 m_Ldvt = dataFriend.
M();
844 #if defined(CISSTNETLIB_VERSION)
845 #if defined(CISSTNETLIB_VERSION_MAJOR)
846 #if (CISSTNETLIB_VERSION_MAJOR >= 3)
847 cisstNetlib_dgesvd_(&m_Jobu, &m_Jobvt, &m_Ldu, &m_Ldvt,
848 A.Pointer(), &m_Lda, dataFriend.
S().
Pointer(),
853 #else // no major version
854 dgesvd_(&m_Jobu, &m_Jobvt, &m_Ldu, &m_Ldvt,
855 A.Pointer(), &m_Lda, dataFriend.
S().
Pointer(),
859 #endif // CISSTNETLIB_VERSION
861 ftnlen jobu_len = (ftnlen)1, jobvt_len = (ftnlen)1;
862 la_dzlapack_MP_sgesvd_nat(&m_Jobu, &m_Jobvt, &m_Ldu, &m_Ldvt,
863 A.Pointer(), &m_Lda, dataFriend.
S().
Pointer(),
867 jobu_len, jobvt_len);
888 template <
class _matrixOwnerTypeA,
class _matrixOwnerTypeU,
889 class _vectorOwnerTypeS,
class _matrixOwnerTypeVt,
890 class _vectorOwnerTypeWorkspace>
922 template <
class _matrixOwnerTypeA,
class _matrixOwnerTypeU,
923 class _vectorOwnerTypeS,
class _matrixOwnerTypeVt>
vctDynamicVector< CISSTNETLIB_DOUBLE > WorkspaceMemory
Definition: nmrSVDEconomy.h:121
const vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > & U(void) const
Definition: nmrSVDEconomy.h:630
void ThrowUnlessOutputSizeIsCorrect(vctDynamicMatrixBase< _matrixOwnerTypeU, CISSTNETLIB_DOUBLE > &inU, vctDynamicVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &inS, vctDynamicMatrixBase< _matrixOwnerTypeVt, CISSTNETLIB_DOUBLE > &inVt) const
Definition: nmrSVDEconomy.h:219
Declaration of vctDynamicMatrix.
Definition: vctDynamicMatrixBase.h:42
const vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > & Vt(void) const
Definition: nmrSVDEconomy.h:636
unsigned int size_type
Definition: nmrSVDEconomy.h:113
size_type MMember
Definition: nmrSVDEconomy.h:144
Data for SVD problem (Dynamic).
Definition: nmrSVDEconomy.h:105
Declaration of vctFixedSizeMatrix.
nmrSVDEconomyDynamicData(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A)
Definition: nmrSVDEconomy.h:431
vctFixedSizeVector< size_type, 2 > nsize_type
Definition: nmrSVDEconomy.h:117
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > SReference
Definition: nmrSVDEconomy.h:136
bool StorageOrder(void)
Definition: nmrSVDEconomy.h:376
bool StorageOrder(void) const
Definition: vctDynamicConstMatrixBase.h:656
void SetRef(size_type size, pointer data, stride_type stride=1)
Definition: vctDynamicVectorRef.h:156
void SetRefOutput(vctDynamicMatrixBase< _matrixOwnerTypeU, CISSTNETLIB_DOUBLE > &inU, vctDynamicVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &inS, vctDynamicMatrixBase< _matrixOwnerTypeVt, CISSTNETLIB_DOUBLE > &inVt)
Definition: nmrSVDEconomy.h:605
nmrSVDEconomyDynamicData()
Definition: nmrSVDEconomy.h:393
void ThrowUnlessWorkspaceSizeIsCorrect(vctDynamicVectorBase< _vectorOwnerTypeWorkspace, CISSTNETLIB_DOUBLE > &inWorkspace) const
Definition: nmrSVDEconomy.h:262
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > & Vt(void)
Definition: nmrSVDEconomy.h:364
nmrSVDEconomyDynamicData(size_type m, size_type n, bool storageOrder)
Definition: nmrSVDEconomy.h:413
const vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & S(void) const
Definition: nmrSVDEconomy.h:623
static size_type WorkspaceSize(size_type m, size_type n)
Definition: nmrSVDEconomy.h:282
void SetSize(size_type size)
Definition: vctDynamicVector.h:315
nmrSVDEconomyDynamicData(vctDynamicMatrixBase< _matrixOwnerTypeU, CISSTNETLIB_DOUBLE > &inU, vctDynamicVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &inS, vctDynamicMatrixBase< _matrixOwnerTypeVt, CISSTNETLIB_DOUBLE > &inVt)
Definition: nmrSVDEconomy.h:496
Definition: vctDynamicConstMatrixBase.h:77
Implementation of a fixed-size vector using template metaprogramming.
Definition: vctFixedSizeVector.h:52
void SetDimension(size_type m, size_type n, bool storageOrder)
Definition: nmrSVDEconomy.h:153
void SetRef(size_type rows, size_type cols, stride_type rowStride, stride_type colStride, pointer dataPointer)
Definition: vctDynamicMatrixRef.h:217
static vctDynamicMatrixBase< _matrixOwnerTypeS, CISSTNETLIB_DOUBLE > & UpdateMatrixS(const vctDynamicConstMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, const vctDynamicConstVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &vectorS, vctDynamicMatrixBase< _matrixOwnerTypeS, CISSTNETLIB_DOUBLE > &matrixS)
Definition: nmrSVDEconomy.h:330
void SetRef(vctDynamicMatrixBase< _matrixOwnerTypeU, CISSTNETLIB_DOUBLE > &inU, vctDynamicVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &inS, vctDynamicMatrixBase< _matrixOwnerTypeVt, CISSTNETLIB_DOUBLE > &inVt, vctDynamicVectorBase< _vectorOwnerTypeWorkspace, CISSTNETLIB_DOUBLE > &inWorkspace)
Definition: nmrSVDEconomy.h:577
bool StorageOrderMember
Definition: nmrSVDEconomy.h:146
nmrSVDEconomyDynamicData(vctDynamicMatrixBase< _matrixOwnerTypeU, CISSTNETLIB_DOUBLE > &inU, vctDynamicVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &inS, vctDynamicMatrixBase< _matrixOwnerTypeVt, CISSTNETLIB_DOUBLE > &inVt, vctDynamicVectorBase< _vectorOwnerTypeWorkspace, CISSTNETLIB_DOUBLE > &inWorkspace)
Definition: nmrSVDEconomy.h:475
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > VtReference
Definition: nmrSVDEconomy.h:135
pointer Pointer(size_type rowIndex, size_type colIndex)
Definition: vctDynamicMatrixBase.h:143
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > & U(void)
Definition: nmrSVDEconomy.h:361
size_type rows() const
Definition: vctDynamicConstMatrixBase.h:238
size_type cols() const
Definition: vctDynamicConstMatrixBase.h:243
void Allocate(size_type m, size_type n, bool storageOrder)
Definition: nmrSVDEconomy.h:555
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > WorkspaceReference
Definition: nmrSVDEconomy.h:137
#define cmnThrow(a)
Definition: MinimalCmn.h:4
vctDynamicVector< CISSTNETLIB_DOUBLE > OutputMemory
Definition: nmrSVDEconomy.h:128
pointer Pointer(index_type index=0)
Definition: vctDynamicVectorBase.h:155
Definition: nmrSVDEconomy.h:352
void SetRefWorkspace(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicVectorBase< _vectorOwnerTypeWorkspace, CISSTNETLIB_DOUBLE > &inWorkspace)
Definition: nmrSVDEconomy.h:532
size_type M(void)
Definition: nmrSVDEconomy.h:370
CISSTNETLIB_INTEGER nmrSVDEconomy(vctDynamicMatrixBase< _matrixOwnerType, CISSTNETLIB_DOUBLE > &A, nmrSVDEconomyDynamicData &data)
Definition: nmrSVDEconomy.h:801
size_type N(void)
Definition: nmrSVDEconomy.h:373
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & S(void)
Definition: nmrSVDEconomy.h:358
Definition: vctDynamicConstVectorBase.h:77
void Allocate(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A)
Definition: nmrSVDEconomy.h:515
Friend(nmrSVDEconomyDynamicData &inData)
Definition: nmrSVDEconomy.h:356
Declaration of the template function cmnThrow.
const bool VCT_COL_MAJOR
Definition: vctForwardDeclarations.h:46
size_type NMember
Definition: nmrSVDEconomy.h:145
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & Workspace(void)
Definition: nmrSVDEconomy.h:367
void AllocateOutputWorkspace(bool allocateOutput, bool allocateWorkspace)
Definition: nmrSVDEconomy.h:179
static nsize_type MatrixSSize(const vctDynamicConstMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A)
Definition: nmrSVDEconomy.h:312
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > UReference
Definition: nmrSVDEconomy.h:134
static size_type WorkspaceSize(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA)
Definition: nmrSVDEconomy.h:297
nmrSVDEconomyDynamicData(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicVectorBase< _vectorOwnerTypeWorkspace, CISSTNETLIB_DOUBLE > &inWorkspace)
Definition: nmrSVDEconomy.h:451
Definition: vctDynamicVectorBase.h:61