如何有效地连接mxArray向量

时间:2016-03-13 17:14:49

标签: c++ matlab

在MATLAB脚本中,我们可以做到

a = [1 2 3]
a = [a 4]

内部MATLAB是否重新分配/复制内存或使用保留内存,直到它不够大?我想它可能会在后来改善性能。它可以通过这种方式进行优化,因为MATLAB知道在追加后没有人引用原始的。

我们如何以相同的方式连接mxArray? mlCreate需要显式的尺寸大小,mlfVertcat似乎返回一个新的尺寸?我不确定mlfVectcat或mlfCat是否可以无需重新分配。

我们可以手动执行以下操作。是否存在任何类似的实用程序?

class mxDynamicDoubleVector {

public:
    mxDynamicDoubleVector(mwSize reservedSize = 2);

    void pushBack(double d);

    const mxArray *getData() const {
        return data_;
    }

    ~mxDynamicDoubleVector();

private:
    mxDynamicDoubleVector(const mxDynamicDoubleVector&);
    void operator = (const mxDynamicDoubleVector&);

    mwSize reservedSize_;    
    mxArray *data_;
};

mxDynamicDoubleVector::mxDynamicDoubleVector(mwSize reservedSize)
    : reservedSize_(reservedSize)
{
    data_ = mxCreateUninitNumericMatrix(1, reservedSize_, mxDOUBLE_CLASS, mxREAL);
    mxSetN(data_, 0);
}

void mxDynamicDoubleVector::pushBack(double d) 
{   
    mwSize n = mxGetN(data_);
    if (n == reservedSize_) {
        double *ptr = mxGetPr(data_);
        reservedSize_ *= 2;
        ptr = static_cast<double*>(mxRealloc(ptr, sizeof(double) * reservedSize_));
        mxSetPr(data_, ptr);
    }
    double *ptr = mxGetPr(data_);
    ptr[n] = d;
    mxSetN(data_, n+1);
}

mxDynamicDoubleVector::~mxDynamicDoubleVector() 
{
    mxDestroyArray(data_);
}

0 个答案:

没有答案