我正在将图像分割方法的实现从C ++转换为Matlab。
这是一个迭代方法,可以调用两个函数: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<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;
}
答案 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)