在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_);
}