implemented diffabs() useful for checks of results up to a sign
This commit is contained in:
		
							parent
							
								
									9d0249cdc4
								
							
						
					
					
						commit
						cf86493a6f
					
				
							
								
								
									
										46
									
								
								mat.cc
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								mat.cc
									
									
									
									
									
								
							@ -1429,29 +1429,6 @@ NRMat<std::complex<double> >::operator+=(const NRMat< std::complex<double> >  &r
 | 
				
			|||||||
	return *this;
 | 
						return *this;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/***************************************************************************//**
 | 
					 | 
				
			||||||
 * add a given general matrix (type T) \f$A\f$ to the current complex matrix
 | 
					 | 
				
			||||||
 * @param[in] rhs matrix \f$A\f$ of type T
 | 
					 | 
				
			||||||
 * @return reference to the modified matrix
 | 
					 | 
				
			||||||
 ******************************************************************************/
 | 
					 | 
				
			||||||
template <typename T>
 | 
					 | 
				
			||||||
NRMat<T> & NRMat<T>::operator+=(const NRMat<T>  &rhs) {
 | 
					 | 
				
			||||||
#ifdef DEBUG
 | 
					 | 
				
			||||||
	if (nn != rhs.nn || mm != rhs.mm) laerror("incompatible matrices");
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	SAME_LOC(*this, rhs);
 | 
					 | 
				
			||||||
	NOT_GPU(*this);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	copyonwrite();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	#ifdef MATPTR
 | 
					 | 
				
			||||||
		for(size_t i=0; i< (size_t)nn*mm; i++) v[0][i] += rhs.v[0][i];
 | 
					 | 
				
			||||||
	#else
 | 
					 | 
				
			||||||
		for(size_t i=0; i< (size_t)nn*mm; i++) v[i] += rhs.v[i];
 | 
					 | 
				
			||||||
	#endif
 | 
					 | 
				
			||||||
        return *this;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/***************************************************************************//**
 | 
					/***************************************************************************//**
 | 
				
			||||||
 * subtract a given real matrix \f$A\f$ from the current real matrix
 | 
					 * subtract a given real matrix \f$A\f$ from the current real matrix
 | 
				
			||||||
@ -1505,29 +1482,6 @@ NRMat< std::complex<double> >::operator-=(const NRMat< std::complex<double> >  &
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/***************************************************************************//**
 | 
					 | 
				
			||||||
 * subtract a given general matrix (type T) \f$A\f$ from the current matrix
 | 
					 | 
				
			||||||
 * @param[in] rhs matrix \f$A\f$ of type T
 | 
					 | 
				
			||||||
 * @return reference to the modified matrix
 | 
					 | 
				
			||||||
 ******************************************************************************/
 | 
					 | 
				
			||||||
template <typename T>
 | 
					 | 
				
			||||||
NRMat<T> & NRMat<T>::operator-=(const NRMat<T>  &rhs) {
 | 
					 | 
				
			||||||
#ifdef DEBUG
 | 
					 | 
				
			||||||
	if (nn != rhs.nn || mm != rhs.mm) laerror("incompatible matrices");
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	SAME_LOC(*this, rhs);
 | 
					 | 
				
			||||||
	NOT_GPU(*this);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	copyonwrite();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	#ifdef MATPTR
 | 
					 | 
				
			||||||
		for(size_t i=0; i< (size_t)nn*mm; i++) v[0][i] += rhs.v[0][i];
 | 
					 | 
				
			||||||
	#else
 | 
					 | 
				
			||||||
		for(size_t i=0; i<(size_t) nn*mm; i++) v[i] += rhs.v[i];
 | 
					 | 
				
			||||||
	#endif
 | 
					 | 
				
			||||||
        return *this;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/***************************************************************************//**
 | 
					/***************************************************************************//**
 | 
				
			||||||
 * add a given sparse real matrix \f$A\f$ stored in packed form to the current
 | 
					 * add a given sparse real matrix \f$A\f$ stored in packed form to the current
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										70
									
								
								mat.h
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								mat.h
									
									
									
									
									
								
							@ -406,6 +406,7 @@ public:
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						NRMat diffabs(const NRMat &rhs) const; //difference of absolute values
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}//namespace
 | 
					}//namespace
 | 
				
			||||||
@ -1402,6 +1403,75 @@ void NRMat<T>::moveto(const GPUID dest) {
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***************************************************************************//**
 | 
				
			||||||
 | 
					 * add a given general matrix (type T) \f$A\f$ to the current complex matrix
 | 
				
			||||||
 | 
					 * @param[in] rhs matrix \f$A\f$ of type T
 | 
				
			||||||
 | 
					 * @return reference to the modified matrix
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					template <typename T>
 | 
				
			||||||
 | 
					NRMat<T> & NRMat<T>::operator+=(const NRMat<T>  &rhs) {
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
						if (nn != rhs.nn || mm != rhs.mm) laerror("incompatible matrices");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						SAME_LOC(*this, rhs);
 | 
				
			||||||
 | 
						NOT_GPU(*this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						copyonwrite();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#ifdef MATPTR
 | 
				
			||||||
 | 
							for(size_t i=0; i< (size_t)nn*mm; i++) v[0][i] += rhs.v[0][i];
 | 
				
			||||||
 | 
						#else
 | 
				
			||||||
 | 
							for(size_t i=0; i< (size_t)nn*mm; i++) v[i] += rhs.v[i];
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
 | 
					        return *this;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***************************************************************************//**
 | 
				
			||||||
 | 
					 * subtract a given general matrix (type T) \f$A\f$ from the current matrix
 | 
				
			||||||
 | 
					 * @param[in] rhs matrix \f$A\f$ of type T
 | 
				
			||||||
 | 
					 * @return reference to the modified matrix
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					template <typename T>
 | 
				
			||||||
 | 
					NRMat<T> & NRMat<T>::operator-=(const NRMat<T>  &rhs) {
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
						if (nn != rhs.nn || mm != rhs.mm) laerror("incompatible matrices");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						SAME_LOC(*this, rhs);
 | 
				
			||||||
 | 
						NOT_GPU(*this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						copyonwrite();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#ifdef MATPTR
 | 
				
			||||||
 | 
							for(size_t i=0; i< (size_t)nn*mm; i++) v[0][i] -= rhs.v[0][i];
 | 
				
			||||||
 | 
						#else
 | 
				
			||||||
 | 
							for(size_t i=0; i<(size_t) nn*mm; i++) v[i] -= rhs.v[i];
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
 | 
					        return *this;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*difference of absolute values*/
 | 
				
			||||||
 | 
					template <typename T>
 | 
				
			||||||
 | 
					NRMat<T>  NRMat<T>::diffabs(const NRMat<T> &rhs) const {
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
					        if (nn != rhs.nn ||mm!=rhs.mm) laerror("incompatible dimensions");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					        NOT_GPU(*this);
 | 
				
			||||||
 | 
					        NOT_GPU(rhs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NRMat<T> r(nn,mm);
 | 
				
			||||||
 | 
					        #ifdef MATPTR
 | 
				
			||||||
 | 
					                for(size_t i=0; i< (size_t)nn*mm; i++) r.v[0][i] = MYABS(v[0][i]) - MYABS(rhs.v[0][i]);
 | 
				
			||||||
 | 
					        #else
 | 
				
			||||||
 | 
					                for(size_t i=0; i<(size_t) nn*mm; i++) r.v[i] = MYABS(v[i]) - MYABS(rhs.v[i]);
 | 
				
			||||||
 | 
					        #endif
 | 
				
			||||||
 | 
					        return r;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -26,12 +26,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace LA {
 | 
					namespace LA {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename T>
 | 
					 | 
				
			||||||
inline  typename LA_traits<T>::normtype  MYABS(const T &x) {return abs(x);}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
template <>
 | 
					 | 
				
			||||||
inline unsigned int MYABS(const  unsigned int &x) {return x;}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename T>
 | 
					template <typename T>
 | 
				
			||||||
class Polynomial : public NRVec<T> {
 | 
					class Polynomial : public NRVec<T> {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										16
									
								
								smat.h
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								smat.h
									
									
									
									
									
								
							@ -186,6 +186,7 @@ public:
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						NRSMat diffabs(const NRSMat &rhs) const; //difference of absolute values
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}//namespace
 | 
					}//namespace
 | 
				
			||||||
@ -389,6 +390,21 @@ inline NRSMat<T> & NRSMat<T>::operator-=(const T &a) {
 | 
				
			|||||||
	return *this;
 | 
						return *this;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*difference of absolute values*/
 | 
				
			||||||
 | 
					template <typename T>
 | 
				
			||||||
 | 
					NRSMat<T>  NRSMat<T>::diffabs(const NRSMat<T> &rhs) const {
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
					        if (nn != rhs.nn) laerror("incompatible dimensions");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					        NOT_GPU(*this);
 | 
				
			||||||
 | 
					        NOT_GPU(rhs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NRSMat<T> r(nn);
 | 
				
			||||||
 | 
					        for(int i=0; i<NN2; ++i) r.v[i] = MYABS(v[i]) - MYABS(rhs.v[i]);
 | 
				
			||||||
 | 
					        return r;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/***************************************************************************//**
 | 
					/***************************************************************************//**
 | 
				
			||||||
 * add up this real symmetric matrix with given symmetric matrix
 | 
					 * add up this real symmetric matrix with given symmetric matrix
 | 
				
			||||||
 * @param[in] rhs real symmetric matrix to be added
 | 
					 * @param[in] rhs real symmetric matrix to be added
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										35
									
								
								vec.h
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								vec.h
									
									
									
									
									
								
							@ -33,6 +33,20 @@ template <typename T> void lawritemat(FILE *file, const T *a, int r, int c,
 | 
				
			|||||||
template <typename T> class NRPerm;
 | 
					template <typename T> class NRPerm;
 | 
				
			||||||
template <typename T> class CyclePerm;
 | 
					template <typename T> class CyclePerm;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***************************************************************************//**
 | 
				
			||||||
 | 
					 * auxiliary macro to avoid compilation errors for some types
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					template <typename T>
 | 
				
			||||||
 | 
					inline  typename LA_traits<T>::normtype  MYABS(const T &x) {return abs(x);}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <> inline unsigned char MYABS(const  unsigned char &x) {return x;}
 | 
				
			||||||
 | 
					template <> inline unsigned short MYABS(const  unsigned short &x) {return x;}
 | 
				
			||||||
 | 
					template <> inline unsigned int MYABS(const  unsigned int &x) {return x;}
 | 
				
			||||||
 | 
					template <> inline unsigned long MYABS(const  unsigned long &x) {return x;}
 | 
				
			||||||
 | 
					template <> inline unsigned long long MYABS(const  unsigned long long &x) {return x;}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/***************************************************************************//**
 | 
					/***************************************************************************//**
 | 
				
			||||||
 * static constants used in several cblas-routines
 | 
					 * static constants used in several cblas-routines
 | 
				
			||||||
 ******************************************************************************/
 | 
					 ******************************************************************************/
 | 
				
			||||||
@ -394,6 +408,8 @@ public:
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						NRVec diffabs(const NRVec &rhs) const; //difference of absolute values
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -759,6 +775,25 @@ inline NRVec<T> & NRVec<T>::operator-=(const NRVec<T> &rhs) {
 | 
				
			|||||||
        return *this;
 | 
					        return *this;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***************************************************************************//**
 | 
				
			||||||
 | 
					 * difference of elements of two vectors in absolute values
 | 
				
			||||||
 | 
					 * \f[\vec{z}_i = \vec{x}_i-\vec{y}_i\f]
 | 
				
			||||||
 | 
					 * @param[in] rhs vector \f$\vec{y}\f$
 | 
				
			||||||
 | 
					 * @return reference to the modified vector
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					template <typename T>
 | 
				
			||||||
 | 
					NRVec<T>  NRVec<T>::diffabs(const NRVec<T> &rhs) const {
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
						if (nn != rhs.nn) laerror("incompatible dimensions");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						NOT_GPU(*this);
 | 
				
			||||||
 | 
						NOT_GPU(rhs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NRVec<T> r(nn);
 | 
				
			||||||
 | 
						for(int i=0; i<nn; ++i) r[i] = MYABS(v[i]) - MYABS(rhs.v[i]);
 | 
				
			||||||
 | 
					        return r;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/***************************************************************************//**
 | 
					/***************************************************************************//**
 | 
				
			||||||
 * multiply this general vector \f$\vec{x}\f$ by scalar value \f$\lambda\f$
 | 
					 * multiply this general vector \f$\vec{x}\f$ by scalar value \f$\lambda\f$
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user