Я конвертирую реализацию метода сегментации изображений из C ++ в Matlab.
Это итеративный метод, который выполняет вызовы двух функций: em () и mpm (). Эти две функции используют две достаточно большие вспомогательные матрицы, поэтому, чтобы избежать перераспределения памяти при каждом вызове в моей реализации C ++, я предварительно выделил память для матриц и сбросил ее значения, когда это было необходимо.
Как мне избежать перераспределения памяти в реализации Matlab? Насколько я знаю, предварительное размещение матриц не решит мою проблему, потому что, когда функция пытается изменить значения аргумента, Matlab автоматически создает его копию.
Можно ли объявить переменную, которая является общей для всех функций в М-файле?
Edit:
Вот схема моего кода 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<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;
}