Предотвращение перераспределения памяти в Matlab - PullRequest
1 голос
/ 06 сентября 2010

Я конвертирую реализацию метода сегментации изображений из 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;
}

Ответы [ 2 ]

1 голос
/ 06 сентября 2010
1 голос
/ 06 сентября 2010

Хотя команда global может объявлять разделяемую переменную, обычно это не очень хорошая идея.

Одной из возможностей может быть создание класса дескриптора, который содержит некоторые вещи.Возможно, что-то вроде:

ValueHandle.m:

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

Теперь вы можете создавать объекты ValueHandle и получать доступ к их свойству value.Сам дескриптор может передаваться между функциями, такими как ссылка или указатель на другом языке.Это может помочь несколько.Вероятно, для этого требуется недавняя версия MATLAB.

Если это не помогает так, как вам бы хотелось, рассматривали ли вы возможность использования системы расширений mex MATLAB для объединения существующего кода C ++ с MATLAB?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...