20 #include <odindata/data.h>
42 Array<T,1>
matrix_product(
const Array<T,2>& matrix,
const Array<T,1>& vector) {
44 int nrows=matrix.extent(0);
45 int ncols=matrix.extent(1);
47 Array<T,1> result(nrows);
50 int vector_extent=vector.extent(0);
51 if(vector.extent(0)!=ncols) {
52 ODINLOG(odinlog,errorLog) <<
"size mismatch (vector_extent=" << vector_extent <<
") != (ncols=" << ncols <<
")" << STD_endl;
57 for(
int icol=0; icol<ncols; icol++) {
58 for(
int irow=0; irow<nrows; irow++) {
59 result(irow)+=matrix(irow,icol)*vector(icol);
72 Array<T,2>
matrix_product(
const Array<T,2>& matrix1,
const Array<T,2>& matrix2) {
74 int nrows=matrix1.extent(0);
75 int ncols=matrix2.extent(1);
76 ODINLOG(odinlog,normalDebug) <<
"nrows/ncols=" << nrows <<
"/" << ncols << STD_endl;
78 Array<T,2> result(nrows,ncols);
81 if(matrix1.extent(1)!=matrix2.extent(0)) {
82 ODINLOG(odinlog,errorLog) <<
"size mismatch (matrix1=" << matrix1.shape() <<
", matrix2=" << matrix2.shape() <<
")" << STD_endl;
86 int nprod=matrix1.extent(1);
87 ODINLOG(odinlog,normalDebug) <<
"nprod=" << nprod << STD_endl;
88 for(
int irow=0; irow<nrows; irow++) {
89 for(
int icol=0; icol<ncols; icol++) {
92 for(
int iprod=0; iprod<nprod; iprod++) {
93 scalprod+= matrix1(irow,iprod)*matrix2(iprod,icol);
95 result(irow,icol)=scalprod;
111 Array<T,1> result(3);
112 if(u.extent(0)!=3 || v.extent(0)!=3) {
113 ODINLOG(odinlog,errorLog) <<
"input size != 3" << STD_endl;
116 result(0)=u(1)*v(2)-u(2)*v(1);
117 result(1)=u(2)*v(0)-u(0)*v(2);
118 result(2)=u(0)*v(1)-u(1)*v(0);
128 template<
typename T,
int N_rank>
129 bool operator == (
const TinyVector<T,N_rank>& t1,
const TinyVector<T,N_rank>& t2) {
130 return sum(abs(t1-t2))==0;
138 template<
typename T,
int N_rank>
139 bool operator != (
const TinyVector<T,N_rank>& t1,
const TinyVector<T,N_rank>& t2) {
148 template<
typename T,
int N_rows,
int N_columns>
149 TinyVector<T,N_rows>
operator * (
const TinyMatrix<T, N_rows, N_columns>& matrix,
const TinyVector<T, N_columns>& vector) {
150 TinyVector<T,N_rows> result;
153 for(
int icol=0; icol<N_columns; icol++) {
154 for(
int irow=0; irow<N_rows; irow++) {
155 result(irow)+=matrix(irow,icol)*vector(icol);
167 template<
typename T,
int N_rank>
168 bool same_shape(
const Array<T,N_rank>& a1,
const Array<T,N_rank>& a2,
const TinyVector<int,N_rank>& dimmask=1) {
169 for(
int i=0; i<N_rank; i++) {
170 if(dimmask(i) && (a1.extent(i)!=a2.extent(i)) )
return false;
181 bool on_grid(
const TinyVector<int,3>& shape,
const TinyVector<int,3>& index) {
182 for(
int i=0; i<N_rank; i++) {
183 if(index(i)<0 || index(i)>=shape(i)) {
196 template <
typename T>
199 if(val<min) {val=min; in_range=
false;}
200 if(val>max) {val=max; in_range=
false;}
210 template<
typename T,
int N_rank>
212 TinyVector<int,N_rank> indexvec;
213 for(
unsigned int i=0; i<data.numElements(); i++) {
215 if(data(indexvec)>val) data(indexvec)=val;
222 template<
typename T,
int N_rank>
224 TinyVector<int,N_rank> indexvec;
225 for(
unsigned int i=0; i<data.numElements(); i++) {
227 if(data(indexvec)<val) data(indexvec)=val;
TinyVector< int, N_rank > create_index(unsigned long index) const
void clip_min(Data< T, N_rank > &data, T val)
void clip_max(Data< T, N_rank > &data, T val)
Array< T, 1 > vector_product(const Array< T, 1 > &u, const Array< T, 1 > &v)
bool operator!=(const TinyVector< T, N_rank > &t1, const TinyVector< T, N_rank > &t2)
bool on_grid(const TinyVector< int, 3 > &shape, const TinyVector< int, 3 > &index)
bool same_shape(const Array< T, N_rank > &a1, const Array< T, N_rank > &a2, const TinyVector< int, N_rank > &dimmask=1)
bool operator==(const TinyVector< T, N_rank > &t1, const TinyVector< T, N_rank > &t2)
TinyVector< T, N_rows > operator*(const TinyMatrix< T, N_rows, N_columns > &matrix, const TinyVector< T, N_columns > &vector)
bool check_range(T &val, T min, T max)
Data< float, 1 > unwrap_phase(const Data< float, 1 > &phase, int startindex=0)
Array< T, 1 > matrix_product(const Array< T, 2 > &matrix, const Array< T, 1 > &vector)
fvector phase(const cvector &cv)