[vsipl++] Matlab IO
Assem Salama
assem at codesourcery.com
Fri Jul 7 04:20:46 UTC 2006
Jules Bergmann wrote:
> Assem, I have 8 comments below. -- Jules
>
> > + template <vsip::dimension_type Dim>
> > + struct view_header
> > + {
> > + data_element header;
> > + data_element array_flags_header;
> > + uint32_t array_flags[2];
> > + data_element dim_header;
> > + uint32_t dim[Dim + Dim%2]; //the dim has to be aligned to an 8
> byte boundary
>
> [1] Can you make sure this comment fits into 80-columns?
Yes it is.
>
> > + data_element array_name_header;
> > + };
>
> > + // the read function for real or complex depending of the view
> that was
> > + // passed in
> > + template <typename T1,
> > + typename ViewT>
> > + void read(std::istream& is,ViewT v,bool swap_bytes)
> > + {
> > + vsip::dimension_type const View_dim = ViewT::dim;
> > + vsip::Index<View_dim> my_index;
> > + vsip::impl::Length<View_dim> v_extent = extent(v);
> > + T1 data;
> > + typedef typename ViewT::value_type scalar_type;
> > +
> > + // get num_points
> > + vsip::length_type num_points = v.size();
> > +
> > + // read all the points
> > + for(vsip::index_type i=0;i<num_points;i++) {
> > + is.read(reinterpret_cast<char*>(&data),sizeof(data));
> > + swap<T1>(&data,swap_bytes);
>
> [2] The intent of the wrapper template function 'swap' is to let the
> compiler infer template parameters automatically. Since 'data' is of
> type 'T1', you can just say:
>
> swap(&data, swap_bytes);
>
> Unless the inferred type would be incorrect, can you remove the
> explicit parameter?
>
>
> > +
> > +// operator to read view from matlab file
> > +template <typename T,
> > + typename Block0,
> > + template <typename,typename> class View>
> > +inline
> > +std::istream&
> > +operator>>(
> > + std::istream& is,
> > + Matlab_bin_formatter<View<T,Block0> > mbf)
> > +{
> > + matlab::data_element temp_data_element;
> > + matlab::view_header<vsip::impl::Dim_of_view<View>::dim> m_view;
> > + typedef typename vsip::impl::Scalar_of<T>::type scalar_type;
> > + typedef matlab::Subview_helper<View<T,Block0> > subview;
> > + typedef typename subview::realview_type r_v;
> > + typedef typename subview::imagview_type i_v;
> > + vsip::dimension_type v_dim = vsip::impl::Dim_of_view<View>::dim;
> > +
> > +
> > + // read header
> > + is.read(reinterpret_cast<char*>(&m_view),sizeof(m_view));
> > +
>
> [3] When does mbf.header.endian get initialized? Have you written a
> unit test for these routines? (If not, please do that next).
>
mbf.header gets initialized in the constructor. I have a test that
writes and read vectors,matrices,and tensors.
>
> > + // do we need to swap fields?
> > + matlab::swap_header(m_view,mbf.header.endian);
>
> [4] The second arg to swap_header is a bool indicating if bytes should
> be swapped. Passing mbf.header.endian (a uint16_t) will nearly always
> be true (unless the matlab file is corrupted). Can you do something
> like:
>
> bool swap_bytes;
>
> if (mbf.header.endian == 'M' << 8 | 'I') swap_bytes = false;
> else if (mbf.header.endian == 'I' << 8 | 'M') swap_bytes = true;
> else
> VSIP_IMPL_THROW(std::runtime_error(
> "Matlab file header has invalid endian field"));
>
> matlab::swap_header(m_view, swap_bytes);
>
>
> > +
> > + // is this complex?
> > + if(vsip::impl::Is_complex<T>::value &&
> !(m_view.array_flags[0]&(1<<11)))
> > + VSIP_IMPL_THROW(std::runtime_error(
> > + "Trying to read complex matrix into a real matrix"));
>
> [5] Please change this to "Trying to read a complex view into a real
> view"
>
> > +
> > +
> > + // is this the same class?
> > + if(!((m_view.array_flags[0] & 0xff) ==
> > + (matlab::Matlab_header_traits<sizeof(scalar_type),
> > + std::numeric_limits<scalar_type>::is_signed,
> > + std::numeric_limits<scalar_type>::is_integer>::class_type)
> > + ))
> > + VSIP_IMPL_THROW(std::runtime_error(
> > + "Trying to read a matrix of a different class"));
>
> [6] Please change this to "Trying to read a view with different class
> of value type"
>
> > +
> > + // do dimensions agree?
> > + if(v_dim == 1) m_view.dim_header.size -= 4; // special case for
> vectors
> > + if(v_dim != (m_view.dim_header.size/4))
> > + VSIP_IMPL_THROW(std::runtime_error(
> > + "Trying to read a matrix of different dimensions"));
>
> [7] Please change this to "Trying to read a view with different
> dimension"
>
> > +
> > + for(vsip::dimension_type i=0;i<v_dim;i++)
> > + if(mbf.view.size(i) != m_view.dim[i])
> > + VSIP_IMPL_THROW(std::runtime_error(
> > + "Matrix dimensions don't agree"));
>
> [8] Please change this to "View dimensions don't agree"
>
>
More information about the vsipl++
mailing list