【问题标题】:When is it effective to use global variables in MATLAB?在 MATLAB 中使用全局变量何时有效?
【发布时间】:2018-06-30 05:40:45
【问题描述】:

我正在编写一个 MATLAB 代码,其输入之一是 1 MP RGB 图像。 此图像在整个过程中没有改变。

在我的代码中,图像从主函数发送到其子函数等。 这个过程真的很慢,我正在努力使代码更有效率。 将图片定义为全局变量,在任何函数中调用,不来回发送,是否更有效?

谢谢!

【问题讨论】:

  • 什么都不需要。只需将图像作为常规参数发送给 sub-functions 。您应该分析代码以查看瓶颈在哪里。
  • 阅读 Matlab 的copy on write

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


【解决方案1】:

这表示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

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

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

【讨论】:

  • 我不同意。如果您不修改输入,Matlab 通过引用(某种方式)传递。
  • 啊该死的,我完全误解了这里的问题。
  • @CrisLuengo MATLAB 不会“如果您不修改输入,则通过引用(某种方式)传递”,当他们听到这种事情时,它真的让很多人感到困惑。 MATLAB 按值传递,但具有写时复制或延迟复制行为。
  • @SamRoberts 我认为这并不令人困惑:局部变量引用用作输入参数的矩阵数据。数据不会被复制而是被引用。如何实现引用传递是一个细节,并不总是相关的。
【解决方案2】:

您可以在声明它时调用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

【讨论】:

    【解决方案3】:

    您会在许多功能中更改该图像吗? Matlab 具有写时复制机制,可防止复制输入参数,除非它们在函数内部发生更改。

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

    classdef BufStorage < handle
        properties
            Data
        end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 2014-12-13
      • 2014-10-27
      • 2013-03-09
      • 1970-01-01
      • 2013-10-22
      相关资源
      最近更新 更多