在Matlab中避免内存重新分配

时间:2010-09-06 02:47:38

标签: matlab memory-management

我正在将图像分割方法的实现从C ++转换为Matlab。

这是一个迭代方法,可以调用两个函数:em()和mpm()。这两个函数使用了两个相当大的辅助矩阵,所以为了避免在我的C ++实现中每次调用时重新分配内存,我已经为矩阵预先分配了内存并在必要时重置了它的值。

如何在Matlab实现中避免内存重新分配?据我所知,预先分配矩阵不会解决我的问题,因为当函数试图改变参数的值时,Matlab会自动创建它的副本。

是否可以声明M文件中所有函数共享的变量?

编辑:

这是我的C ++代码的概述。我预先分配的两个矩阵是chanceMatrixlabelAssignedVector

GSegmentedImage * GEmMpmSegmentator::segmentImage(GImage * image, int labelRange, int steps, unsigned char minGrayLevel){
GSegmentedImage * segmentedImage = new GSegmentedImage(image->getHeight(), image->getWidth());
GParameterVector * paramVector = new GParameterVector(labelRange);

randomizeLabelField(segmentedImage, labelRange);
setOutOfImageLabel(segmentedImage, image, minGrayLevel);
initializeParameterVector(image, paramVector);

// labelAssignedVector stores how many times a pixel received a label 'k'.
// row = image row, column = image column, page = label.
G3DMatrix<unsigned char> * labelAssignedVector = new G3DMatrix<unsigned char>(image->getHeight(), image->getWidth(), labelRange);

// Chance matrix is used by the mpm method.
// chanceMatrix: row = label, column = gray level, page = number of different neighbors
G3DMatrix<double> * chanceMatrix = new G3DMatrix<double>(paramVector->getLabelRange(), 256, 9);

for (int i = 0; i < steps; i++){
    labelAssignedVector->reset();
    if (difPenalty < difMax){
        difPenalty += difInc;
    }

    mpm(paramVector, labelAssignedVector, segmentedImage, image, minGrayLevel, chanceMatrix);
    em(paramVector, labelAssignedVector, image);
}

delete paramVector;
return segmentedImage;
}

2 个答案:

答案 0 :(得分:1)

虽然global命令可以声明共享变量,但这通常不是一个好主意。

一种可能性是创建一个包含某些东西的句柄类。也许是这样的事情:

ValueHandle.m:

classdef ValueHandle < handle
    properties
        value
    end
    methods
        function self = ValueHandle(value)
            self.value = value;
        end
    end
end

现在,您可以创建ValueHandle对象并访问其value属性。句柄本身可以在函数之间传递,如引用或另一种语言的指针。这可能会有所帮助。这可能需要最新版本的MATLAB。

如果这没有您想要的那么多,您是否考虑过使用MATLAB的mex扩展系统来使用MATLAB桥接现有的C ++代码?

答案 1 :(得分:1)