Matlab MEX C ++将输入稀疏数组的参数传递给std :: vectors的有效方法

问题描述

我想知道如何有效地从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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...