24#ifdef BOOST_NO_STDC_NAMESPACE
41 assert(v1.get_index_range() == v2.get_index_range());
43 typename Array<1, elemT>::const_iterator i1 = v1.
begin();
44 typename Array<1, elemT>::const_iterator i2 = v2.
begin();
45 for (; i1 != v1.
end(); ++i1, ++i2)
46 tmp += ((*i1) * (*i2));
51inline std::complex<elemT>
52inner_product(
const Array<1, std::complex<elemT>>& v1,
const Array<1, std::complex<elemT>>& v2)
54 assert(v1.get_index_range() == v2.get_index_range());
55 std::complex<elemT> tmp = 0;
56 typename Array<1, std::complex<elemT>>::const_iterator i1 = v1.begin();
57 typename Array<1, std::complex<elemT>>::const_iterator i2 = v2.begin();
58 for (; i1 != v1.end(); ++i1, ++i2)
59 tmp += (std::conj(*i1) * (*i2));
77template <
class elemT,
class vecT>
79matrix_multiply_help(vecT& retval,
const Array<2, elemT>& m,
const vecT& vec)
81 assert(m.is_regular());
87 const int m_min_row = m.get_min_index();
88 const int m_max_row = m.get_max_index();
89 const int m_min_col = m[m_min_row].get_min_index();
90 const int m_max_col = m[m_min_row].get_max_index();
92 assert(vec.get_min_index() == m_min_col);
93 assert(vec.get_max_index() == m_max_col);
94 for (
int i = m_min_row; i <= m_max_row; ++i)
97 retval[i] = m[i][j] * vec[j];
98 for (++j; j <= m_max_col; ++j)
99 retval[i] += m[i][j] * vec[j];
104template <
class elemT>
105inline Array<1, elemT>
109 detail::matrix_multiply_help(ret, m, vec);
113template <
int num_dimensions,
class elemT>
114inline BasicCoordinate<num_dimensions, elemT>
115matrix_multiply(
const Array<2, elemT>& m,
const BasicCoordinate<num_dimensions, elemT>& vec)
117 BasicCoordinate<num_dimensions, elemT> ret;
118 detail::matrix_multiply_help(ret, m, vec);
123template <
class elemT>
124inline Array<2, elemT>
129 if (m1.
size() == 0 || m2.
size() == 0)
142 assert(m1[m1_min_row].get_min_index() == m2_min_row);
143 assert(m1[m1_min_row].get_max_index() == m2_max_row);
147 for (
int i = m1_min_row; i <= m1_max_row; ++i)
149 for (
int j = m2_min_col; j <= m2_max_col; ++j)
151 for (
int k = m2_min_row; k <= m2_max_row; ++k)
152 retval[i][j] += m1[i][k] * m2[k][j];
158template <
class elemT>
159inline Array<2, elemT>
174 for (
int j = m_min_row; j <= m_max_row; ++j)
175 for (
int i = m_min_col; i <= m_max_col; ++i)
176 new_m[i][j] = m[j][i];
180template <
class elemT>
181inline Array<2, elemT>
185 for (
unsigned int i = 0; i < dimension; ++i)
190template <
int dimension,
class elemT>
191inline Array<2, elemT>
195 for (
unsigned int i = 0; i < dimension; ++i)
196 m[i][i] = values[i + 1];
This file declares the class stir::IndexRange2D.
This class defines multi-dimensional (numeric) arrays.
Definition Array.h:78
bool is_regular() const
checks if the index range is 'regular'
Definition Array.inl:469
class BasicCoordinate<int num_dimensions, typename coordT> defines num_dimensions -dimensional coordi...
Definition BasicCoordinate.h:57
a 'convenience' class for 2D index ranges.
Definition IndexRange2D.h:38
iterator begin()
use to initialise an iterator to the first element of the vector
Definition VectorWithOffset.inl:190
int get_max_index() const
get value of last valid index
Definition VectorWithOffset.inl:131
int get_min_index() const
get value of first valid index
Definition VectorWithOffset.inl:124
iterator end()
iterator 'past' the last element of the vector
Definition VectorWithOffset.inl:206
size_t size() const
return number of elements in this vector
Definition VectorWithOffset.inl:546
coordT inner_product(const BasicCoordinate< num_dimensions, coordT > &p1, const BasicCoordinate< num_dimensions, coordT > &p2)
compute sum_i p1[i] * p2[i]
Definition BasicCoordinate.inl:408
double norm(const BasicCoordinate< num_dimensions, coordT > &p1)
compute sqrt(inner_product(p1,p1))
Definition BasicCoordinate.inl:426
double angle(const BasicCoordinate< num_dimensions, coordT > &p1, const BasicCoordinate< num_dimensions, coordT > &p2)
compute angle between 2 directions
Definition BasicCoordinate.inl:440
Array< 2, elemT > diagonal_matrix(const unsigned dimension, const elemT value)
construct a diagonal matrix with all elements on the diagonal equal
Definition MatrixFunction.inl:182
Array< 2, elemT > matrix_transpose(const Array< 2, elemT > &m)
matrix transposition
Definition MatrixFunction.inl:160
Array< 1, elemT > matrix_multiply(const Array< 2, elemT > &m, const Array< 1, elemT > &vec)
matrix with vector multiplication
Definition MatrixFunction.inl:106