Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Matlab中避免内存重分配 我将一种图像分割方法从C++转换为Matlab。_Matlab_Memory Management - Fatal编程技术网

在Matlab中避免内存重分配 我将一种图像分割方法从C++转换为Matlab。

在Matlab中避免内存重分配 我将一种图像分割方法从C++转换为Matlab。,matlab,memory-management,Matlab,Memory Management,它是一种迭代方法,可以调用两个函数:em()和mpm()。这两个函数使用两个相当大的辅助矩阵,因此为了避免在我的C++实现中的每个调用中重新分配内存,我已经为矩阵预先存储了内存,并在必要时重新设置了其值。 如何在Matlab实现中避免内存重新分配?据我所知,预先分配矩阵并不能解决我的问题,因为当函数试图更改参数的值时,Matlab会自动创建它的副本 是否可以声明一个M文件中所有函数共享的变量 编辑: 这是我的C++代码的概要。我预先分配的两个矩阵是chanceMatrix和labelAssign

它是一种迭代方法,可以调用两个函数: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;
}
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>而 Global < /Cord>命令可以声明共享变量,这通常不是个好主意。 一种可能是创建一个句柄类来保存一些东西。也许是这样的:

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>如果编写代码,则<代码> EM >代码>和<代码> MPM<代码>是外部主函数内的嵌套函数,然后,他们可以访问外部函数范围内的所有内容。如果您可以将注释作为答案写下来,这样我就可以接受。如果您编写的代码使
em
mpm
是外部主函数内的嵌套函数,这样他们就可以访问外部函数作用域中的所有内容。如果您可以将注释作为答案写下来,这样我就可以接受它了。使用handle类,您可能会遇到意外的性能问题@米哈伊尔:我同意,MATLAB对象系统比它应该的慢。但是,如果您在MATLAB中使用大量内存,您将在某些地方遇到性能问题。使用handle类,您可能会遇到意外的性能问题@米哈伊尔:我同意,MATLAB对象系统比它应该的慢。但是如果你在MATLAB中使用大量内存,你会在某些地方遇到性能问题。