问题描述
我想知道如何有效地从var text = input.Replace("<br/>",Environment.NewLine);
到matlab::data::SparseArray<T>
s中提取值。
作为我要实现的目标的最小工作示例,请考虑一个MEX函数,该函数接收一个稀疏的double数组作为输入,并返回另一个其非零值等于输入的double值的稀疏数组:
std::vector
我至少尝试执行以下操作以提高性能
#include "mex.hpp"
#include "mexAdapter.hpp"
#include <vector>
class MexFunction : public matlab::mex::Function
{
public:
void operator() (matlab::mex::ArgumentList outputs,matlab::mex::ArgumentList inputs)
{
// get the input
matlab::data::SparseArray<double> spArrayInp = std::move(inputs[0]);
// copy the input sparse matrix information to std::vectors
size_t nnzSpIn = spArrayInp.getNumberOfNonZeroElements();
auto dim = spArrayInp.getDimensions();
std::vector<int> rows(nnzSpIn),cols(nnzSpIn);
std::vector<double> vals(nnzSpIn);
// ******* IMPROVE THIS ******* //
auto idx = spArrayInp.getIndex(spArrayInp.begin()); // std::pair<size_t,size_t>
size_t itr=0;
for (matlab::data::TypedIterator<double> inpSpArrayPtr = spArrayInp.begin(); inpSpArrayPtr != spArrayInp.end(); ++inpSpArrayPtr)
{
idx = spArrayInp.getIndex(inpSpArrayPtr);
rows[itr] = idx.first;
cols[itr] = idx.second;
vals[itr++] = *inpSpArrayPtr;
}
// ****** ****** ****** ****** //
// double the values
std::for_each(vals.begin(),vals.end(),[](double &a){a*=2;});
// output doubled sparse matrix
matlab::data::ArrayFactory factory;
auto data_p = factory.createBuffer<double>(nnzSpIn);
auto rows_p = factory.createBuffer<size_t>(nnzSpIn);
auto cols_p = factory.createBuffer<size_t>(nnzSpIn);
double* dataPtr = data_p.get();
size_t* rowsPtr = rows_p.get();
size_t* colsPtr = cols_p.get();
std::for_each(vals.begin(),[&](const double& e) { *(dataPtr++) = e; });
std::for_each(rows.begin(),rows.end(),[&](const size_t& e) { *(rowsPtr++) = e; });
std::for_each(cols.begin(),cols.end(),[&](const size_t& e) { *(colsPtr++) = e; });
outputs[0] = factory.createSparseArray<double>({dim[0],dim[1]},nnzSpIn,std::move(data_p),std::move(rows_p),std::move(cols_p));
}
};
但是使用MEX C ++编译时会使MATLAB崩溃。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)