瀏覽代碼

parse sparse matrices: these should really share code

Former-commit-id: 4975acfd208e61e18efc02c36b9d0b2d4bf2acb0
Alec Jacobson 8 年之前
父節點
當前提交
cac48bd62b
共有 3 個文件被更改,包括 55 次插入5 次删除
  1. 5 5
      include/igl/matlab/MatlabWorkspace.h
  2. 45 0
      include/igl/matlab/parse_rhs.cpp
  3. 5 0
      include/igl/matlab/parse_rhs.h

+ 5 - 5
include/igl/matlab/MatlabWorkspace.h

@@ -476,15 +476,15 @@ inline bool igl::matlab::MatlabWorkspace::find(
   //cout<<name<<": "<<mxGetM(mx_data)<<" "<<mxGetN(mx_data)<<endl;
   const int m = mxGetM(mx_data);
   const int n = mxGetN(mx_data);
-
+  // TODO: It should be possible to directly load the data into the sparse
+  // matrix without going through the triplets
   // Copy data immediately
   double * pr = mxGetPr(mx_data);
   mwIndex * ir = mxGetIr(mx_data);
   mwIndex * jc = mxGetJc(mx_data);
-
   vector<Triplet<MT> > MIJV;
-  MIJV.reserve(mxGetNumberOfElements(mx_data));
-
+  const int nnz = mxGetNzmax(mx_data);
+  MIJV.reserve(nnz);
   // Iterate over outside
   int k = 0;
   for(int j=0; j<n;j++)
@@ -501,8 +501,8 @@ inline bool igl::matlab::MatlabWorkspace::find(
   }
   M.resize(m,n);
   M.setFromTriplets(MIJV.begin(),MIJV.end());
-  return true;
 
+  return true;
 }
 
 inline bool igl::matlab::MatlabWorkspace::find( 

+ 45 - 0
include/igl/matlab/parse_rhs.cpp

@@ -29,6 +29,51 @@ IGL_INLINE void igl::matlab::parse_rhs_index(
   V.array() -= 1;
 }
 
+template <typename MT>
+IGL_INLINE void igl::matlab::parse_rhs(
+  const mxArray *prhs[], 
+  Eigen::SparseMatrix<MT> & M)
+{
+  using namespace Eigen;
+  using namespace std;
+  const mxArray * mx_data = prhs[0];
+  // Handle boring case where matrix is actually an empty dense matrix
+  if(mxGetNumberOfElements(mx_data) == 0)
+  {
+    M.resize(0,0);
+    return;
+  }
+  assert(mxIsSparse(mx_data));
+  assert(mxGetNumberOfDimensions(mx_data) == 2);
+  //cout<<name<<": "<<mxGetM(mx_data)<<" "<<mxGetN(mx_data)<<endl;
+  const int m = mxGetM(mx_data);
+  const int n = mxGetN(mx_data);
+  // TODO: It should be possible to directly load the data into the sparse
+  // matrix without going through the triplets
+  // Copy data immediately
+  double * pr = mxGetPr(mx_data);
+  mwIndex * ir = mxGetIr(mx_data);
+  mwIndex * jc = mxGetJc(mx_data);
+  vector<Triplet<MT> > MIJV;
+  MIJV.reserve(mxGetNumberOfElements(mx_data));
+  // Iterate over outside
+  int k = 0;
+  for(int j=0; j<n;j++)
+  {
+    // Iterate over inside
+    while(k<(int)jc[j+1])
+    {
+      //cout<<ir[k]<<" "<<j<<" "<<pr[k]<<endl;
+      assert((int)ir[k]<m);
+      assert((int)j<n);
+      MIJV.push_back(Triplet<MT >(ir[k],j,pr[k]));
+      k++;
+    }
+  }
+  M.resize(m,n);
+  M.setFromTriplets(MIJV.begin(),MIJV.end());
+}
+
 #ifdef IGL_STATIC_LIBRARY
 template void igl::matlab::parse_rhs_index<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(mxArray_tag const**, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
 template void igl::matlab::parse_rhs_index<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(mxArray_tag const**, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);

+ 5 - 0
include/igl/matlab/parse_rhs.h

@@ -10,6 +10,7 @@
 #include <igl/igl_inline.h>
 #include <mex.h>
 #include <Eigen/Dense>
+#include <Eigen/Sparse>
 namespace igl
 {
   namespace matlab
@@ -29,6 +30,10 @@ namespace igl
     IGL_INLINE void parse_rhs_index(
       const mxArray *prhs[], 
       Eigen::PlainObjectBase<DerivedV> & V);
+    template <typename VType>
+    IGL_INLINE void parse_rhs(
+      const mxArray *prhs[], 
+      Eigen::SparseMatrix<VType> & M);
   }
 };
 #ifndef IGL_STATIC_LIBRARY