31 #ifndef GADGETRON_IMAGE_WRAP_TYPE 32 #define GADGETRON_IMAGE_WRAP_TYPE 34 #include <ismrmrd/ismrmrd.h> 35 #include <ismrmrd/dataset.h> 36 #include <ismrmrd/meta.h> 37 #include <ismrmrd/xml.h> 39 #include "sirf/common/ANumRef.h" 41 #include "sirf/Gadgetron/cgadgetron_shared_ptr.h" 44 #define IMAGE_PROCESSING_SWITCH(Type, Operation, Arguments, ...)\ 45 if (Type == ISMRMRD::ISMRMRD_USHORT)\ 46 Operation ((ISMRMRD::Image<unsigned short>*) Arguments, ##__VA_ARGS__);\ 47 else if (Type == ISMRMRD::ISMRMRD_SHORT)\ 48 Operation ((ISMRMRD::Image<short>*) Arguments, ##__VA_ARGS__);\ 49 else if (Type == ISMRMRD::ISMRMRD_UINT)\ 50 Operation ((ISMRMRD::Image<unsigned int>*) Arguments, ##__VA_ARGS__);\ 51 else if (Type == ISMRMRD::ISMRMRD_INT)\ 52 Operation ((ISMRMRD::Image<int>*) Arguments, ##__VA_ARGS__);\ 53 else if (Type == ISMRMRD::ISMRMRD_FLOAT)\ 54 Operation ((ISMRMRD::Image<float>*) Arguments, ##__VA_ARGS__);\ 55 else if (Type == ISMRMRD::ISMRMRD_DOUBLE)\ 56 Operation ((ISMRMRD::Image<double>*) Arguments, ##__VA_ARGS__);\ 57 else if (Type == ISMRMRD::ISMRMRD_CXFLOAT)\ 58 Operation ((ISMRMRD::Image< std::complex<float> >*) Arguments, \ 60 else if (Type == ISMRMRD::ISMRMRD_CXDOUBLE)\ 61 Operation ((ISMRMRD::Image< std::complex<double> >*) Arguments, \ 64 throw std::domain_error("unknown data type in IMAGE_PROCESSING_SWITCH"); 66 #define IMAGE_PROCESSING_SWITCH_CONST(Type, Operation, Arguments, ...)\ 67 if (Type == ISMRMRD::ISMRMRD_USHORT)\ 68 Operation ((const ISMRMRD::Image<unsigned short>*) Arguments, \ 70 else if (Type == ISMRMRD::ISMRMRD_SHORT)\ 71 Operation ((const ISMRMRD::Image<short>*) Arguments, ##__VA_ARGS__);\ 72 else if (Type == ISMRMRD::ISMRMRD_UINT)\ 73 Operation ((const ISMRMRD::Image<unsigned int>*) Arguments, ##__VA_ARGS__);\ 74 else if (Type == ISMRMRD::ISMRMRD_INT)\ 75 Operation ((const ISMRMRD::Image<int>*) Arguments, ##__VA_ARGS__);\ 76 else if (Type == ISMRMRD::ISMRMRD_FLOAT)\ 77 Operation ((const ISMRMRD::Image<float>*) Arguments, ##__VA_ARGS__);\ 78 else if (Type == ISMRMRD::ISMRMRD_DOUBLE)\ 79 Operation ((const ISMRMRD::Image<double>*) Arguments, ##__VA_ARGS__);\ 80 else if (Type == ISMRMRD::ISMRMRD_CXFLOAT)\ 81 Operation ((const ISMRMRD::Image< std::complex<float> >*) Arguments, \ 83 else if (Type == ISMRMRD::ISMRMRD_CXDOUBLE)\ 84 Operation ((const ISMRMRD::Image< std::complex<double> >*) Arguments, \ 87 throw std::domain_error("unknown data type in IMAGE_PROCESSING_SWITCH_CONST"); 90 typedef ISMRMRD::Image<complex_float_t> CFImage;
91 typedef ISMRMRD::Image<complex_double_t> CDImage;
94 #pragma warning( push ) 96 #pragma warning( disable : 4244 ) 110 Iterator(
int type,
void* data,
unsigned int dsize,
size_t n) :
111 type_(type), ptr_((
char*)data), dsize_(dsize), n_(n), i_(0),
118 dsize_ = iter.dsize_;
121 sptr_iter_ = iter.sptr_iter_;
122 ref_.copy(iter.ref_);
124 bool operator!=(
const Iterator& i)
const 126 return ptr_ != i.ptr_;
128 bool operator==(
const Iterator& i)
const 130 return ptr_ == i.ptr_;
135 throw std::out_of_range(
"cannot advance out-of-range iterator");
154 throw std::out_of_range
155 (
"cannot dereference out-of-range iterator");
163 dsize_ = iter.dsize_;
166 sptr_iter_ = iter.sptr_iter_;
167 ref_.copy(iter.ref_);
176 gadgetron::shared_ptr<Iterator> sptr_iter_;
181 Iterator_const(
int type,
void* data,
unsigned int dsize,
size_t n) :
182 type_(type), ptr_((
char*)data), dsize_(dsize), n_(n), i_(0),
189 dsize_ = iter.dsize_;
192 sptr_iter_ = iter.sptr_iter_;
193 ref_.copy(iter.ref_);
197 return ptr_ != i.ptr_;
201 return ptr_ == i.ptr_;
206 throw std::out_of_range(
"cannot advance out-of-range iterator");
221 const NumRef& operator*()
const 224 std::cout << i_ <<
' ' << n_ <<
'\n';
225 throw std::out_of_range
226 (
"cannot dereference out-of-range iterator");
235 dsize_ = iter.dsize_;
238 sptr_iter_ = iter.sptr_iter_;
239 ref_.copy(iter.ref_);
248 gadgetron::shared_ptr<Iterator_const> sptr_iter_;
256 ImageWrap(uint16_t type, ISMRMRD::Dataset& dataset,
const char* var,
int index) noexcept(
false)
259 IMAGE_PROCESSING_SWITCH(type_, read_, ptr_, dataset, var, index, &ptr_);
264 IMAGE_PROCESSING_SWITCH(type_, copy_, iw.ptr_image());
269 IMAGE_PROCESSING_SWITCH(type_,
delete, ptr_);
284 const void* ptr_image()
const 293 IMAGE_PROCESSING_SWITCH
294 (type_, get_data_parameters_, ptr_, &n, &dsize, &ptr);
295 begin_.reset(
new Iterator(type_, ptr, dsize, n));
303 IMAGE_PROCESSING_SWITCH_CONST
304 (type_, get_data_parameters_, ptr_, &n, &dsize, &ptr);
306 return *begin_const_;
313 IMAGE_PROCESSING_SWITCH
314 (type_, get_data_parameters_, ptr_, &n, &dsize, &ptr);
315 end_.reset(
new Iterator(type_, ptr + n*dsize, dsize, n));
323 IMAGE_PROCESSING_SWITCH_CONST
324 (type_, get_data_parameters_, ptr_, &n, &dsize, &ptr);
325 end_const_.reset(
new Iterator_const(type_, ptr + n*dsize, dsize, n));
332 IMAGE_PROCESSING_SWITCH_CONST(type_, get_size_, ptr_, s);
335 ISMRMRD::ImageHeader& head()
337 IMAGE_PROCESSING_SWITCH(type_,
return get_head_ref_, ptr_);
339 const ISMRMRD::ImageHeader& head()
const 341 IMAGE_PROCESSING_SWITCH_CONST(type_,
return get_head_ref_const_, ptr_);
343 std::string attributes()
const 346 IMAGE_PROCESSING_SWITCH_CONST(type_, get_attr_, ptr_, attr);
349 void set_attributes(
const std::string& attr)
351 IMAGE_PROCESSING_SWITCH(type_, set_attr_, ptr_, attr);
353 void show_attributes()
const 355 IMAGE_PROCESSING_SWITCH_CONST(type_, show_attr_, ptr_, 0);
357 void set_imtype(ISMRMRD::ISMRMRD_ImageTypes imtype)
359 IMAGE_PROCESSING_SWITCH(type_, set_imtype_, ptr_, imtype);
361 size_t get_dim(
int* dim)
const 363 IMAGE_PROCESSING_SWITCH_CONST(type_, get_dim_, ptr_, dim);
370 void get_data(
float* data)
const 376 for (; i != stop; ++data, ++i) {
381 void set_data(
const float* data)
398 void get_complex_data(complex_float_t* data)
const 404 for (; i != stop; ++data, ++i) {
405 *data = (*i).complex_float();
410 void set_complex_data(
const complex_float_t* data)
416 for (; i != stop; ++i, ++data) {
422 gadgetron::shared_ptr<ImageWrap> abs()
const 427 gadgetron::shared_ptr<ImageWrap> real(
const std::string& way =
"real")
const 431 ISMRMRD::Image<float>* ptr_im =
new ISMRMRD::Image<float>(dim[0], dim[1], dim[2], dim[3]);
432 ISMRMRD::Image<float>& im = *ptr_im;
434 ISMRMRD::ImageHeader header = head();
435 header.data_type = ISMRMRD::ISMRMRD_FLOAT;
436 header.image_type = ISMRMRD::ISMRMRD_IMTYPE_MAGNITUDE;
437 header.image_series_index = 0;
440 im.setAttributeString(attributes());
444 float* data = im.getDataPtr();
446 for (; i != stop; ++data, ++i) {
447 *data = std::abs((*i).complex_float());
450 for (; i != stop; ++data, ++i) {
451 *data = std::real((*i).complex_float());
454 THROW(
"unknown conversion to real specified in ImageWrap::real");
457 return gadgetron::shared_ptr<ImageWrap>(ptr_iw);
463 ISMRMRD::ISMRMRD_DataTypes data_type;
464 IMAGE_PROCESSING_SWITCH_CONST(type_, get_data_type_, ptr_, &data_type);
470 ISMRMRD::ISMRMRD_DataTypes data_type = this->
get_data_type();
471 if (data_type == ISMRMRD::ISMRMRD_DataTypes::ISMRMRD_CXFLOAT ||
472 data_type == ISMRMRD::ISMRMRD_DataTypes::ISMRMRD_CXDOUBLE) {
478 void write(ISMRMRD::Dataset& dataset)
const 480 IMAGE_PROCESSING_SWITCH_CONST(type_, write_, ptr_, dataset);
482 void read(ISMRMRD::Dataset& dataset,
const char* var,
int ind)
484 IMAGE_PROCESSING_SWITCH(type_, read_, ptr_, dataset, var, ind, &ptr_);
490 void axpby(complex_float_t a,
const ImageWrap& x, complex_float_t b,
496 void xapyb(
const ImageWrap& x, complex_float_t a,
499 IMAGE_PROCESSING_SWITCH(type_, xapyb_, x.ptr_image(), &a,
500 y.ptr_image(), &b, 0, 0);
502 void xapyb(
const ImageWrap& x, complex_float_t a,
505 IMAGE_PROCESSING_SWITCH(type_, xapyb_, x.ptr_image(), &a,
506 y.ptr_image(), &b, 0, 1);
511 IMAGE_PROCESSING_SWITCH(type_, xapyb_, x.ptr_image(), &a,
512 y.ptr_image(), &b, 1, 0);
517 IMAGE_PROCESSING_SWITCH(type_, xapyb_, x.ptr_image(), a.ptr_image(),
518 y.ptr_image(), b.ptr_image(), 1, 1);
522 IMAGE_PROCESSING_SWITCH(type_, multiply_, x.ptr_image());
526 IMAGE_PROCESSING_SWITCH(type_, multiply__, x.ptr_image(), y.ptr_image());
530 IMAGE_PROCESSING_SWITCH(type_, divide_, x.ptr_image());
534 IMAGE_PROCESSING_SWITCH(type_, divide__, x.ptr_image(), y.ptr_image());
536 complex_float_t dot(
const ImageWrap& iw)
const 539 IMAGE_PROCESSING_SWITCH_CONST(type_, dot_, iw.ptr_image(), &z);
545 IMAGE_PROCESSING_SWITCH_CONST(type_, norm_, ptr_, &r);
551 IMAGE_PROCESSING_SWITCH_CONST(type_, diff_, iw.ptr_image(), &s);
556 IMAGE_PROCESSING_SWITCH(type_, conjugate_, ptr_);
562 mutable gadgetron::shared_ptr<Iterator> begin_;
563 mutable gadgetron::shared_ptr<Iterator> end_;
564 mutable gadgetron::shared_ptr<Iterator_const> begin_const_;
565 mutable gadgetron::shared_ptr<Iterator_const> end_const_;
575 void get_data_parameters_
576 (
const ISMRMRD::Image<T>* ptr_im,
size_t *n,
unsigned int *dsize,
579 const ISMRMRD::Image<T>& im = *(
const ISMRMRD::Image<T>*)ptr_im;
581 dim[0] = im.getMatrixSizeX();
582 dim[1] = im.getMatrixSizeY();
583 dim[2] = im.getMatrixSizeZ();
584 dim[3] = im.getNumberOfChannels();
585 *data = (
char*)im.getDataPtr();
595 void copy_(
const ISMRMRD::Image<T>* ptr_im)
597 type_ = ptr_im->getDataType();
598 ptr_ = (
void*)
new ISMRMRD::Image<T>(*ptr_im);
602 ISMRMRD::ImageHeader& get_head_ref_(ISMRMRD::Image<T>* ptr_im)
604 return ptr_im->getHead();
608 const ISMRMRD::ImageHeader& get_head_ref_const_(
const ISMRMRD::Image<T>* ptr_im)
const 610 return ptr_im->getHead();
614 void set_imtype_(ISMRMRD::Image<T>* ptr_im, ISMRMRD::ISMRMRD_ImageTypes type)
616 ptr_im->setImageType(type);
620 void get_size_(
const ISMRMRD::Image<T>* ptr_im,
size_t& size)
const 622 size = ptr_im->getDataSize();
626 void get_attr_(
const ISMRMRD::Image<T>* ptr_im, std::string& attr)
const 628 ptr_im->getAttributeString(attr);
632 void set_attr_(ISMRMRD::Image<T>* ptr_im,
const std::string& attr)
634 ptr_im->setAttributeString(attr);
638 void show_attr_(
const ISMRMRD::Image<T>* ptr_im,
int i)
const 640 const ISMRMRD::Image<T>& im = *ptr_im;
641 size_t meta_attrib_length = im.getAttributeStringLength();
642 std::cout <<
"meta_attrib_length: " << meta_attrib_length <<
'\n';
643 std::string meta_attrib(meta_attrib_length + 1, 0);
644 im.getAttributeString(meta_attrib);
647 if (meta_attrib_length > 0) {
648 ISMRMRD::MetaContainer mc;
649 ISMRMRD::deserialize(meta_attrib.c_str(), mc);
650 for (
auto it = mc.begin(); it != mc.end(); ++it) {
651 auto name = it->first.c_str();
652 std::cout << name <<
":\n";
653 size_t l = mc.length(name);
654 for (
int j = 0; j <l; j++)
655 std::cout << mc.as_str(name, j) <<
'\n';
657 std::stringstream meta_xml;
658 ISMRMRD::serialize(mc, meta_xml);
659 std::cout << meta_xml.str().c_str() <<
'\n';
665 (
const ISMRMRD::Image<T>* ptr_im, ISMRMRD::Dataset& dataset)
const 668 const ISMRMRD::Image<T>& im = *ptr_im;
669 std::stringstream ss;
670 ss <<
"image_" << im.getHead().image_series_index;
671 std::string image_varname = ss.str();
675 dataset.appendImage(image_varname, im);
682 (
const ISMRMRD::Image<T>* ptr,
683 ISMRMRD::Dataset& dataset,
const char* var,
int index,
686 ISMRMRD::Image < T >* ptr_im =
new ISMRMRD::Image < T > ;
687 *ptr_ptr = (
void*)ptr_im;
688 ISMRMRD::Image<T>& im = *ptr_im;
689 dataset.readImage(var, index, im);
694 void get_dim_(
const ISMRMRD::Image<T>* ptr_im,
int* dim)
const 696 const ISMRMRD::Image<T>& im = *(
const ISMRMRD::Image<T>*)ptr_im;
697 dim[0] = im.getMatrixSizeX();
698 dim[1] = im.getMatrixSizeY();
699 dim[2] = im.getMatrixSizeZ();
700 dim[3] = im.getNumberOfChannels();
703 void get_data_type_(
const ISMRMRD::Image<T>* ptr_im, ISMRMRD::ISMRMRD_DataTypes* data_type_ptr)
const 705 const ISMRMRD::Image<T>& im = *
static_cast<const ISMRMRD::Image<T>*
>(ptr_im);
706 *data_type_ptr = im.getDataType();
710 void get_data_(
const ISMRMRD::Image<T>* ptr_im,
float* data)
const 712 const ISMRMRD::Image<T>& im = *ptr_im;
713 const T* ptr = im.getDataPtr();
714 size_t n = im.getNumberOfDataElements();
715 for (
size_t i = 0; i < n; i++)
716 data[i] = std::real(ptr[i]);
720 void set_data_(ISMRMRD::Image<T>* ptr_im,
const float* data)
722 ISMRMRD::Image<T>& im = *ptr_im;
723 T* ptr = im.getDataPtr();
724 size_t n = im.getNumberOfDataElements();
725 for (
size_t i = 0; i < n; i++)
730 void get_complex_data_
731 (
const ISMRMRD::Image<T>* ptr_im, complex_float_t* data)
const 733 const ISMRMRD::Image<T>& im = *ptr_im;
734 const T* ptr = im.getDataPtr();
735 size_t n = im.getNumberOfDataElements();
736 for (
size_t i = 0; i < n; i++)
737 data[i] = complex_float_t(ptr[i]);
741 void set_complex_data_
742 (ISMRMRD::Image<T>* ptr_im,
const complex_float_t* data)
744 ISMRMRD::Image<T>& im = *ptr_im;
745 ISMRMRD::ISMRMRD_DataTypes type = im.getDataType();
746 T* ptr = im.getDataPtr();
747 size_t n = im.getNumberOfDataElements();
748 if (type == ISMRMRD::ISMRMRD_CXFLOAT || type == ISMRMRD::ISMRMRD_CXDOUBLE)
749 for (
size_t i = 0; i < n; i++)
750 xGadgetronUtilities::convert_complex(data[i], ptr[i]);
752 for (
size_t i = 0; i < n; i++)
753 xGadgetronUtilities::convert_complex(data[i], ptr[i]);
783 (
const ISMRMRD::Image<T>* ptr_x, complex_float_t a,
784 const void* vptr_y, complex_float_t b)
786 ISMRMRD::Image<T>* ptr_y = (ISMRMRD::Image<T>*)vptr_y;
787 ISMRMRD::Image<T>* ptr = (ISMRMRD::Image<T>*)ptr_;
788 size_t n = ptr->getNumberOfDataElements();
789 size_t nx = ptr_x->getNumberOfDataElements();
790 size_t ny = ptr_y->getNumberOfDataElements();
791 if (!(n == nx && n == ny))
792 THROW(
"sizes mismatch in ImageWrap multiply");
793 const T* i = ptr_x->getDataPtr();
794 const T* j = ptr_y->getDataPtr();
795 T* k = ptr->getDataPtr();
796 if (b == complex_float_t(0.0))
797 for (
size_t ii = 0; ii < n; i++, k++, ii++) {
798 complex_float_t u = (complex_float_t)*i;
799 xGadgetronUtilities::convert_complex(a*u, *k);
802 for (
size_t ii = 0; ii < n; i++, j++, k++, ii++) {
803 complex_float_t u = (complex_float_t)*i;
804 complex_float_t v = (complex_float_t)*j;
805 complex_float_t w = a*u + b*v;
806 xGadgetronUtilities::convert_complex(w, *k);
812 (
const ISMRMRD::Image<T>* ptr_x,
const void* vptr_a,
813 const void* vptr_y,
const void* vptr_b,
int a_type,
int b_type)
815 ISMRMRD::Image<T>* ptr_y = (ISMRMRD::Image<T>*)vptr_y;
816 ISMRMRD::Image<T>* ptr = (ISMRMRD::Image<T>*)ptr_;
817 size_t n = ptr->getNumberOfDataElements();
818 size_t nx = ptr_x->getNumberOfDataElements();
820 THROW(
"sizes mismatch in ImageWrap::xapyb: nx != n");
821 size_t ny = ptr_y->getNumberOfDataElements();
823 THROW(
"sizes mismatch in ImageWrap::xapyb: ny != n");
824 const T* ix = ptr_x->getDataPtr();
825 const T* iy = ptr_y->getDataPtr();
826 T* i = ptr->getDataPtr();
837 ISMRMRD::Image<T>* ptr_a = (ISMRMRD::Image<T>*)vptr_a;
838 na = ptr_a->getNumberOfDataElements();
840 THROW(
"sizes mismatch in ImageWrap xapyb: na != n");
841 ia = ptr_a->getDataPtr();
850 ISMRMRD::Image<T>* ptr_b = (ISMRMRD::Image<T>*)vptr_b;
851 nb = ptr_b->getNumberOfDataElements();
853 THROW(
"sizes mismatch in ImageWrap xapyb: nb != n");
854 ib = ptr_b->getDataPtr();
857 for (
size_t ii = 0; ii < n; ix++, ia += ja, iy++, ib += jb, i++, ii++) {
858 complex_float_t vx = (complex_float_t)*ix;
859 complex_float_t va = (complex_float_t)*ia;
860 complex_float_t vy = (complex_float_t)*iy;
861 complex_float_t vb = (complex_float_t)*ib;
862 complex_float_t v = vx * va + vy * vb;
863 xGadgetronUtilities::convert_complex(v, *i);
868 void multiply_(
const ISMRMRD::Image<T>* ptr_x)
870 ISMRMRD::Image<T>* ptr_y = (ISMRMRD::Image<T>*)ptr_;
871 size_t nx = ptr_x->getNumberOfDataElements();
872 size_t ny = ptr_y->getNumberOfDataElements();
874 THROW(
"sizes mismatch in ImageWrap multiply");
875 const T* i = ptr_x->getDataPtr();
876 T* j = ptr_y->getDataPtr();
878 for (; ii < nx; i++, j++, ii++) {
879 complex_float_t u = (complex_float_t)*i;
880 complex_float_t v = (complex_float_t)*j;
881 xGadgetronUtilities::convert_complex(u*v, *j);
886 void multiply__(
const ISMRMRD::Image<T>* ptr_x,
const void* vptr_y)
888 ISMRMRD::Image<T>* ptr = (ISMRMRD::Image<T>*)ptr_;
889 ISMRMRD::Image<T>* ptr_y = (ISMRMRD::Image<T>*)vptr_y;
890 size_t nx = ptr_x->getNumberOfDataElements();
891 size_t ny = ptr_y->getNumberOfDataElements();
892 size_t n = ptr->getNumberOfDataElements();
893 if (!(n == nx && n == ny))
894 THROW(
"sizes mismatch in ImageWrap multiply");
895 const T* i = ptr_x->getDataPtr();
896 const T* j = ptr_y->getDataPtr();
897 T* k = ptr->getDataPtr();
899 for (; ii < n; i++, j++, k++, ii++) {
900 complex_float_t u = (complex_float_t)*i;
901 complex_float_t v = (complex_float_t)*j;
902 xGadgetronUtilities::convert_complex(u*v, *k);
907 void divide_(
const ISMRMRD::Image<T>* ptr_x)
909 ISMRMRD::Image<T>* ptr_y = (ISMRMRD::Image<T>*)ptr_;
910 size_t nx = ptr_x->getNumberOfDataElements();
911 size_t ny = ptr_y->getNumberOfDataElements();
913 THROW(
"sizes mismatch in ImageWrap divide 1");
914 const T* i = ptr_x->getDataPtr();
915 T* j = ptr_y->getDataPtr();
917 for (; ii < nx; i++, j++, ii++) {
918 complex_float_t u = (complex_float_t)*i;
919 complex_float_t v = (complex_float_t)*j;
920 xGadgetronUtilities::convert_complex(v / u, *j);
925 void divide__(
const ISMRMRD::Image<T>* ptr_x,
const void* vptr_y)
927 ISMRMRD::Image<T>* ptr = (ISMRMRD::Image<T>*)ptr_;
928 ISMRMRD::Image<T>* ptr_y = (ISMRMRD::Image<T>*)vptr_y;
929 size_t nx = ptr_x->getNumberOfDataElements();
930 size_t ny = ptr_y->getNumberOfDataElements();
931 size_t n = ptr->getNumberOfDataElements();
932 if (!(n == nx && n == ny))
933 THROW(
"sizes mismatch in ImageWrap divide 2");
934 const T* i = ptr_x->getDataPtr();
935 const T* j = ptr_y->getDataPtr();
936 T* k = ptr->getDataPtr();
938 for (; ii < n; i++, j++, k++, ii++) {
939 complex_float_t u = (complex_float_t)*i;
940 complex_float_t v = (complex_float_t)*j;
941 xGadgetronUtilities::convert_complex(u / v, *k);
946 void dot_(
const ISMRMRD::Image<T>* ptr_im, complex_float_t *z)
const 948 const ISMRMRD::Image<T>* ptr = (
const ISMRMRD::Image<T>*)ptr_;
953 size_t n = ptr_im->getNumberOfDataElements();
954 for (i = ptr->getDataPtr(), j = ptr_im->getDataPtr(); ii < n;
956 complex_float_t u = (complex_float_t)*i;
957 complex_float_t v = (complex_float_t)*j;
958 *z += std::conj(v) * u;
963 void norm_(
const ISMRMRD::Image<T>* ptr,
float *r)
const 968 size_t n = ptr->getNumberOfDataElements();
969 for (i = ptr->getDataPtr(); ii < n; i++, ii++) {
970 complex_float_t a = (complex_float_t)*i;
971 *r += std::abs(std::conj(a) * a);
977 void diff_(
const ISMRMRD::Image<T>* ptr_im,
float *s)
const 979 const ISMRMRD::Image<T>* ptr = (
const ISMRMRD::Image<T>*)ptr_;
984 size_t n = ptr_im->getNumberOfDataElements();
985 for (i = ptr->getDataPtr(), j = ptr_im->getDataPtr(); ii < n;
987 complex_float_t a = (complex_float_t)*i;
988 complex_float_t b = (complex_float_t)*j;
989 *s += (float)std::abs(b - a);
994 void conjugate_(ISMRMRD::Image<T>* ptr)
998 size_t n = ptr->getNumberOfDataElements();
999 for (i = ptr->getDataPtr(); ii < n; i++, ii++) {
1000 complex_float_t a = (complex_float_t)*i;
1001 xGadgetronUtilities::convert_complex(std::conj(a), *i);
1009 #pragma warning( pop ) bool iequals(const std::string &a, const std::string &b)
Case insensitive string comparison, replaces boost::iequals.
Definition: iequals.cpp:7
Definition: xgadgetron_utilities.h:107
Case insensitive string comparison sirf::iequals.
Definition: ANumRef.h:140
Abstract data container.
Definition: GeometricalInfo.cpp:141
Definition: gadgetron_image_wrap.h:108
bool is_complex() const
Is the image wrap complex?
Definition: gadgetron_image_wrap.h:468
Definition: gadgetron_image_wrap.h:179
Various utilities used by SIRF Gadgetron extensions.
ISMRMRD::ISMRMRD_DataTypes get_data_type() const
Get data type.
Definition: gadgetron_image_wrap.h:461
Wrapper for ISMRMRD::Image.
Definition: gadgetron_image_wrap.h:106