// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2015 Alec Jacobson // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. #include "prepare_lhs.h" #include template IGL_INLINE void igl::matlab::prepare_lhs_double( const Eigen::PlainObjectBase & V, mxArray *plhs[]) { using namespace std; using namespace Eigen; const int m = V.rows(); const int n = V.cols(); plhs[0] = mxCreateDoubleMatrix(m,n, mxREAL); Eigen::Map< Eigen::Matrix > map(mxGetPr(plhs[0]),m,n); map = V.template cast(); } template IGL_INLINE void igl::matlab::prepare_lhs_logical( const Eigen::PlainObjectBase & V, mxArray *plhs[]) { using namespace std; using namespace Eigen; const int m = V.rows(); const int n = V.cols(); plhs[0] = mxCreateLogicalMatrix(m,n); mxLogical * Vp = static_cast(mxGetData(plhs[0])); Eigen::Map< Eigen::Matrix > map(static_cast(mxGetData(plhs[0])),m,n); map = V.template cast(); } template IGL_INLINE void igl::matlab::prepare_lhs_index( const Eigen::PlainObjectBase & V, mxArray *plhs[]) { // Treat indices as reals const auto Vd = (V.template cast().array()+1).eval(); return prepare_lhs_double(Vd,plhs); } template IGL_INLINE void igl::matlab::prepare_lhs_double( const Eigen::SparseMatrix & M, mxArray *plhs[]) { using namespace std; const int m = M.rows(); const int n = M.cols(); // THIS WILL NOT WORK FOR ROW-MAJOR assert(n==M.outerSize()); const int nzmax = M.nonZeros(); plhs[0] = mxCreateSparse(m, n, nzmax, mxREAL); mxArray * mx_data = plhs[0]; // Copy data immediately double * pr = mxGetPr(mx_data); mwIndex * ir = mxGetIr(mx_data); mwIndex * jc = mxGetJc(mx_data); // Iterate over outside int k = 0; for(int j=0; j::InnerIterator it (M,j); it; ++it) { // copy (cast to double) pr[k] = it.value(); ir[k] = it.row(); k++; } } jc[M.outerSize()] = k; } #ifdef IGL_STATIC_LIBRARY template void igl::matlab::prepare_lhs_index >(Eigen::PlainObjectBase > const&, mxArray_tag**); template void igl::matlab::prepare_lhs_index >(Eigen::PlainObjectBase > const&, mxArray_tag**); template void igl::matlab::prepare_lhs_double >(Eigen::PlainObjectBase > const&, mxArray_tag**); template void igl::matlab::prepare_lhs_index >(Eigen::PlainObjectBase > const&, mxArray_tag**); template void igl::matlab::prepare_lhs_logical >(Eigen::PlainObjectBase > const&, mxArray_tag**); template void igl::matlab::prepare_lhs_double >(Eigen::PlainObjectBase > const&, mxArray_tag**); template void igl::matlab::prepare_lhs_logical >(Eigen::PlainObjectBase > const&, mxArray_tag**); template void igl::matlab::prepare_lhs_index >(Eigen::PlainObjectBase > const&, mxArray_tag**); template void igl::matlab::prepare_lhs_double >(Eigen::PlainObjectBase > const&, mxArray_tag**); template void igl::matlab::prepare_lhs_double >(Eigen::PlainObjectBase > const&, mxArray_tag**); template void igl::matlab::prepare_lhs_double >(Eigen::PlainObjectBase > const&, mxArray_tag**); #endif