matlab中的类特定数据文件

时间:2015-02-02 09:52:41

标签: matlab

我正在编写一个使用.mat文件数据的matlab类。 有什么办法可以将这个数据文件放在类目录结构中,并且只能让我的类访问它吗?

即。我有一个像这样的目录结构:

./MATLAB
  +myPackage
    @MyClass
      MyClass.m

MyClass.m看起来像

classdef MyClass
  methods
    function y = getValue(obj, x)
      load datafile.mat
      y = interp1(datax, datay, x);
    end
  end
end

只要datafile.mat位于我的工作目录中,此功能就会很好,但我想将其移至+myPackage/@MyClass/datafile.mat(或者更好+myPackage/datafile.mat)。我如何让我的班级在那里找到它?

1 个答案:

答案 0 :(得分:0)

首先,您可以将数据文件放在目录结构中的'private'子文件夹中:

./MATLAB
  +myPackage
    private
     datafile.mat
    @MyClass
     MyClass.m 

注意:这并不保证只有您的课程才能访问,无论如何它将被分类为接近您的班级定义。

然后,您可以在方法中找到这样的返回数据值:

classdef MyClass
  methods
    function y = getValue(obj, x)

      % Find back datafile name          
      localPath = fileparts(mfilename('fullpath'));
      dataFilename = fullfile(localpath, '..', 'private', 'datafile.mat'); % '..' is to go up one folder, up to you to place th file somewhere else (e.g. under +MyPackage directly)

      % Read file
      data = load(dataFilename);
      datax = data.datax;
      datay = data.datay;

      y = interp1(datax, datay, x);
    end
  end
end

编辑:资源类的示例

以下是一个使用单独资源类的示例,以避免每次调用getValue时加载文件数据。我还补充说,如果文件已被修改,你需要关心:

classdef Resources

    methods(Static)
        function [resource] = GetResource(name, careForUpdates)
        %[
            if (nargin < 2), careForUpdates = true; end
            if (nargin < 1), error('Not enough input arguments.'); end

            persistent cache;
            if (isempty(cache)), cache = containers.Map('UniformValues', false); end

            filename = Resources.GetFileName(name);
            lastModified = dir(filename);
            lastModified = datenum(lastModified.date);
            if (~cache.isKey(name) || ...
                (careForUpdates &&   (cache(name).LastModified < lastModified)))
                data.LastModified = lastModified;
                data.Value = load(filename);                        
                cache(name) = data;                        
            end
            resource = cache(name).Value;            
        %]
        end
    end

    methods(Static, Access=private)
        function [fname] = GetFileName(name)
        %[
            persistent cache;
            if (isempty(cache)), cache = containers.Map('UniformValues', false); end
            if (~cache.isKey(name))
                localpath = fileparts(mfilename('fullpath'));
                switch(name)
                    case 'titi', cache(name) = fullfile(localpath, 'titi.mat');
                    case 'toto', cache(name) = fullfile(localpath, 'toto.mat');
                    case 'tata', cache(name) = fullfile(localpath, 'tata.mat');
                    otherwise, error('Resource `%s` is unknown', name)
                end
            end
            fname = cache(name);                             
        %]
        end
    end

end

这可以像这样使用

data = Resources.Get('titi');

或者,如果对文件更新不感兴趣:

careForFileUpdates = false;
data = Resources.Get('titi', careForFileUpdates);