Przeglądaj źródła

bug fix in transpose for row major

Former-commit-id: 5c7f41a78e7b4a8ad5af4a25d3eb95c2e91085fd
Alec Jacobson 10 lat temu
rodzic
commit
31226a102f

+ 19 - 2
include/igl/matlab/parse_rhs.cpp

@@ -7,13 +7,30 @@ IGL_INLINE void igl::parse_rhs_double(
     Eigen::PlainObjectBase<DerivedV> & V)
 {
   using namespace std;
+  using namespace Eigen;
   // set number of mesh vertices
   const int n = mxGetM(prhs[0]);
   // set vertex position pointers
   double * Vp = mxGetPr(prhs[0]);
   const int dim = mxGetN(prhs[0]);
-  V.resize(n,dim);
-  copy(Vp,Vp+n*dim,&V.data()[0]);
+
+  typedef typename DerivedV::Scalar Scalar;
+  Matrix<Scalar, DerivedV::ColsAtCompileTime, DerivedV::RowsAtCompileTime, RowMajor> VT;
+  Scalar * V_data;
+  if(DerivedV::IsRowMajor)
+  {
+    VT.resize(dim,n);
+    V_data = VT.data();
+  }else
+  {
+    V.resize(n,dim);
+    V_data = V.data();
+  }
+  copy(Vp,Vp+n*dim,V_data);
+  if(DerivedV::IsRowMajor)
+  {
+    V = VT.transpose();
+  }
 }
 
 template <typename DerivedV>

+ 30 - 2
include/igl/matlab/prepare_lhs.cpp

@@ -6,9 +6,23 @@ IGL_INLINE void igl::prepare_lhs_double(
   mxArray *plhs[])
 {
   using namespace std;
+  using namespace Eigen;
   plhs[0] = mxCreateDoubleMatrix(V.rows(),V.cols(), mxREAL);
   double * Vp = mxGetPr(plhs[0]);
-  copy(&V.data()[0],&V.data()[0]+V.size(),Vp);
+
+  typedef typename DerivedV::Scalar Scalar;
+  const Scalar * V_data;
+  Matrix<Scalar, DerivedV::ColsAtCompileTime, DerivedV::RowsAtCompileTime, RowMajor> VT;
+  if(DerivedV::IsRowMajor)
+  {
+    VT = V.transpose();
+    V_data = VT.data();
+  }else
+  {
+    V_data = V.data();
+  }
+
+  copy(V_data,V_data+V.size(),Vp);
 }
 
 template <typename DerivedV>
@@ -17,9 +31,23 @@ IGL_INLINE void igl::prepare_lhs_logical(
   mxArray *plhs[])
 {
   using namespace std;
+  using namespace Eigen;
   plhs[0] = mxCreateLogicalMatrix(V.rows(),V.cols());
   mxLogical * Vp = static_cast<mxLogical*>(mxGetData(plhs[0]));
-  copy(&V.data()[0],&V.data()[0]+V.size(),Vp);
+
+  typedef typename DerivedV::Scalar Scalar;
+  const Scalar * V_data;
+  Matrix<Scalar, DerivedV::ColsAtCompileTime, DerivedV::RowsAtCompileTime, RowMajor> VT;
+  if(DerivedV::IsRowMajor)
+  {
+    VT = V.transpose();
+    V_data = VT.data();
+  }else
+  {
+    V_data = V.data();
+  }
+
+  copy(V_data,V_data+V.size(),Vp);
 }
 
 template <typename DerivedV>