5

可能重复:
在 MATLAB 中声明全局变量

目前我的 matlab 代码在一个没有内部函数的大脚本文件中。我想在我的脚本中声明函数,以使我的代码更具可读性和重用代码等。这在 matlab 中本身并不难,例如

示例 1:

function main()
  myfunc('goat');
end

function myfunc(x)
  fprintf(x);
end

我的问题是我有一个 biig 数据文件,我只想加载一次,这样我就可以在开发过程中重新运行我的代码,而无需花费时间重新加载数据。在我当前的框架中,这不是问题,它有一个没有内部函数的大脚本。一种解决方案是拥有两个 matlab 脚本文件。一个用于加载数据,然后在另一个脚本中调用函数。

但是在上面的示例 1 中,真正的全局变量声明将不起作用,并且每次运行脚本时我都被迫加载 biig 文件。我想做的可以用两个例子来展示:

示例 2:

% Global variable
if ~exist('data',var) 
  data = load biigdatafile.mat;  %FAILS, outside function.
end

function main()
  myfunc('goat');
end

function myfunc(x)
  fprintf(x);
end

示例 3:

function main()
  % Global variable
  if ~exist('data',var)
    global data;     % Is not really global after whole script is completed.
    data = load biigdatafile.mat;
  end
  myfunc('goat');
end

function myfunc(x)
  fprintf(x);
end

所以我的问题是如何声明一个真正的全局变量,如示例 2 所示,我在其中加载一次数据以留在工作区中,同时在一个脚本中调用我的函数?

4

3 回答 3

2

使用输入参数,这就是它们的用途

您可以只使用主函数的参数,将数据集加载到基础工作区中,然后使用该数据集作为参数调用您的函数。如果任何子功能也使用数据集,请将其传递

function main(data)
    if nargin<1
        disp('hey, you forgot to supply the dataset!');
    end
    % do your stuff
    showData(data);
end

然后在基础工作区中:

Data = load('biigdatafile.mat');
main(Data);

使用持久变量

persistent X Y ZXY和定义Z为声明它们的函数的局部变量;但是它们的值在函数调用之间保留在内存中。持久变量类似于全局变量,因为 MATLAB 软件为两者创建了永久存储。它们与全局变量的不同之处在于,持久变量只有在其中声明它们的函数才知道。

所以你可以很容易地使用:

function main()
    persistent data;
    if isempty(data)
        disp('loading dataset');
        data=load('biigdatafile.mat');
    end
    % do your stuff
    showData(data);
end

第一次在已清除的基础工作区或已清除的函数*上调用此函数时,将加载数据集。每次下一次(当函数没有被编辑时),数据集已经/仍然在内存中。

当我只使用一个数据集时,我通常会这样做;总是加载数据集很乏味,在测试函数时,只需按 F5 也更容易。



* 您可能会问什么时候清除一个功能?

每当您清除或修改内存中的函数时,MATLAB 也会清除该函数声明的所有持久变量。要在 MATLAB 退出之前将函数保留在内存中,请使用mlock

于 2012-12-13T00:50:23.103 回答
0

全局变量必须在使用它们的任何地方声明。只需将它添加global data到您需要的任何地方,它就会起作用。

于 2012-12-12T20:31:40.347 回答
0

它不是在 matlab 中声明全局变量的重复。全局变量只能访问所有函数,但是当脚本完成时,全局变量已经消失,我需要再次将它们读入内存。

我需要将局部变量移动到基础工作区,然后在其他函数调用期间再次访问它。我实际上自己解决了它,现在用这段代码

function main()
  try
    Data = evalin('base','Data'); % Move back from base workspace
    fprintf('Already loaded...\n');
  catch
    fprintf('Loading data...');
    data = load biigdatafile.mat;
    assignin('base', 'Data', Data); % Move to base workspace
    fprintf('Ok\n');
  end

  showDocID(Data{1});
end

function showData(Data)
  fprintf(['Data: "' Data '"\n']);
end
于 2012-12-12T21:22:07.100 回答