什么时候在MATLAB中使用全局变量是有效的?

时间:2018-01-21 13:19:54

标签: image matlab performance global-variables processing-efficiency

我正在编写一个MATLAB代码,其中一个输入是1 MP RGB图像。 此图像在整个过程中未被更改。

在我的代码中,图像已从主函数发送到其子功能等。 这个过程非常慢,我正在努力提高代码的效率。 将图像定义为全局变量并在任何函数中调用它而不是来回发送它是否更有效?

谢谢!

3 个答案:

答案 0 :(得分:3)

这表示可以在图像变量上使用global modifier的情况如下:

global img;
img = imread('...');

x = process_image();

function x = process_image()
    global img; % this brings the img variable with its current value

    a = process_image_a();
    b = process_image_b();
    x = ...; % do something with a, b and img
end

function a = process_image_a()
    global img; % this brings the img variable with its current value
    a = ...; % do something with img
end

function b = process_image_b()
    global img; % this brings the img variable with its current value
    b = ...; % do something with img
end

这种方法的缺点是您必须在每个范围(函数,工作空间等)中使用global关键字重新声明变量,您希望在其中共享变量。虽然这可以降低函数的复杂性并提高代码的可读性(这是否真的有必要?),但绝不会提高代码的性能。

虽然参数的内存中位置是已知的,但每次遇到global关键字时,必须在运行时“搜索”全局变量的位置。因此,全局变量总是会变慢。

如果您将上述代码的性能与下面代码的性能进行比较(假设您在两者中执行相同的计算):

img = imread('...');
x = process_image(img);

function x = process_image(img)
    a = process_image_a(img);
    b = process_image_b(img);
    x = ...; % do something with a, b and img
end

function a = process_image_a(img)
    a = ...; % do something with img
end

function b = process_image_b(img)
    b = ...; % do something with img
end

你会发现后者总是比前者表现稍好。

总的来说,无论如何,这是一个次要的性能问题。您应该调试和分析您的功能,以便在关注此问题之前检测真正的瓶颈并缩短执行时间。

答案 1 :(得分:1)

您是否在许多功能中更改了该图像? Matlab具有写时复制机制,可以防止复制输入参数,除非它们在函数内被更改。

我已经解决了将句柄类写为共享数据的“容器”这样的问题。只需创建新的句柄类文件并在其数据字段中应用每个更改,例如:

classdef BufStorage < handle
    properties
        Data
    end
end

答案 2 :(得分:0)

您可以在声明时调用global image,当您需要使用它时,您只需再次调用全局图像。例如

%Start of code
global image
image = (however you got your image)


Function one()
global image;
%use image for whatever it needs to be used for
end