Matlab:真正的全局变量

时间:2012-12-12 20:16:17

标签: matlab global-variables

  

可能重复:
  Declaring a global variable in 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所示,我将数据加载一次以保留在工作区中,同时在一个脚本中调用我的函数?

3 个答案:

答案 0 :(得分:2)

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

所做的

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

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 variables

  

persistent X Y ZXYZ定义为声明它们的函数的本地变量;但是它们的值在调用函数之间保留在内存中。持久变量类似于全局变量,因为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

答案 1 :(得分:0)

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

答案 2 :(得分: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