它是一个迭代方法,调用两个函数:em()和mpm()。这两个函数使用两个相当大的辅助矩阵,因此为了避免在我的C++实现中的每个调用中重新分配内存,我已经为矩阵预先存储了内存,并且在必要时重新设置了其值。
如何在Matlab实现中避免内存重新分配?据我所知,预先分配矩阵并不能解决我的问题,因为当函数试图更改参数值时,Matlab会自动创建一个副本。
是否可以声明M文件中所有函数共享的变量?
编辑:
这是我的C++代码的概要。我预先分配的两个矩阵是
chanceMatrix
和
labelAssignedVector
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 * labelAssignedVector = new G3DMatrix(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 * chanceMatrix = new G3DMatrix(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;
}