我正在编写一个使用.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
)。我如何让我的班级在那里找到它?
答案 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);