在Matlab中避免内存重分配 我将一种图像分割方法从C++转换为Matlab。
它是一种迭代方法,可以调用两个函数:em()和mpm()。这两个函数使用两个相当大的辅助矩阵,因此为了避免在我的C++实现中的每个调用中重新分配内存,我已经为矩阵预先存储了内存,并在必要时重新设置了其值。 如何在Matlab实现中避免内存重新分配?据我所知,预先分配矩阵并不能解决我的问题,因为当函数试图更改参数的值时,Matlab会自动创建它的副本 是否可以声明一个M文件中所有函数共享的变量 编辑: 这是我的C++代码的概要。我预先分配的两个矩阵是在Matlab中避免内存重分配 我将一种图像分割方法从C++转换为Matlab。,matlab,memory-management,Matlab,Memory Management,它是一种迭代方法,可以调用两个函数:em()和mpm()。这两个函数使用两个相当大的辅助矩阵,因此为了避免在我的C++实现中的每个调用中重新分配内存,我已经为矩阵预先存储了内存,并在必要时重新设置了其值。 如何在Matlab实现中避免内存重新分配?据我所知,预先分配矩阵并不能解决我的问题,因为当函数试图更改参数的值时,Matlab会自动创建它的副本 是否可以声明一个M文件中所有函数共享的变量 编辑: 这是我的C++代码的概要。我预先分配的两个矩阵是chanceMatrix和labelAssign
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;
}
GSegmentedImage*GEmMpmSegmentator::segmentImage(GImage*image、int-labelRange、int-steps、unsigned字符级别){
GSegmentedImage*segmentedImage=newgsegmentedimage(image->getHeight(),image->getWidth());
GParameterVector*paramVector=新的GParameterVector(labelRange);
randomizeLabelField(分段图像,labelRange);
setOutOfImageLabel(分段图像、图像、水平);
初始化参数向量(图像,参数向量);
//LabelAsignedVector存储像素接收标签“k”的次数。
//行=图像行,列=图像列,页=标签。
G3DMatrix*LabelAsignedVector=新的G3DMatrix(图像->getHeight(),图像->getWidth(),labelRange);
//概率矩阵用于mpm方法。
//chanceMatrix:行=标签,列=灰度,页=不同邻居的数量
G3DMatrix*chanceMatrix=新的G3DMatrix(参数向量->getLabelRange(),256,9);
对于(int i=0;ireset();
if(difPenalty
虽然全局
命令可以声明共享变量,但这通常不是一个好主意
一种可能是创建一个句柄类来保存一些东西。也许是这样的:
ValueHandle.m:
classdef ValueHandle < handle
properties
value
end
methods
function self = ValueHandle(value)
self.value = value;
end
end
end
classdef ValueHandle
现在,您可以创建ValueHandle对象并访问其值
属性。句柄本身可以在函数之间传递,就像另一种语言中的引用或指针一样。这可能会有所帮助。这可能需要最新版本的MATLAB
如果你想这样做没有多大帮助,你是否考虑过使用Matlab的代码> MEX < /C>扩展系统来用Matlab来桥接现有C++代码?
>P>而classdef ValueHandle < handle
properties
value
end
methods
function self = ValueHandle(value)
self.value = value;
end
end
end
classdef ValueHandle
现在,您可以创建ValueHandle对象并访问其值
属性。句柄本身可以在函数之间传递,就像另一种语言中的引用或指针一样。这可能会有所帮助。这可能需要最新版本的MATLAB
<>如果这不太有用,你是否考虑过使用Matlab的代码> MEX < /C>扩展系统来用Matlab来桥接现有的C++代码?< /p>如果编写代码,则<代码> EM >代码>和<代码> MPM<代码>是外部主函数内的嵌套函数,然后,他们可以访问外部函数范围内的所有内容。如果您可以将注释作为答案写下来,这样我就可以接受。如果您编写的代码使
em
和mpm
是外部主函数内的嵌套函数,这样他们就可以访问外部函数作用域中的所有内容。如果您可以将注释作为答案写下来,这样我就可以接受它了。使用handle类,您可能会遇到意外的性能问题@米哈伊尔:我同意,MATLAB对象系统比它应该的慢。但是,如果您在MATLAB中使用大量内存,您将在某些地方遇到性能问题。使用handle类,您可能会遇到意外的性能问题@米哈伊尔:我同意,MATLAB对象系统比它应该的慢。但是如果你在MATLAB中使用大量内存,你会在某些地方遇到性能问题。