Matlab 从对象内部访问对象
我创建了一个Matlab 从对象内部访问对象,matlab,Matlab,我创建了一个TestData对象,多个文件使用该对象以特定格式放置数据。这是课程(剪下的版本): 有权访问它的文件之一是我的FileIO对象。这将处理存在外部文件而不是原始数据的情况。我似乎遇到的问题是两个对象之间的接口。我的目的是能够使用FileIO中的readDataFromFile功能读取文件;组织FileIO对象内的数据;然后将该数据传递到TestData对象,在该对象中可以对其进行梳理以进行最终验证,然后将其写入单独的外部文件 classdef FileIO < TestData
TestData
对象,多个文件使用该对象以特定格式放置数据。这是课程(剪下的版本):
有权访问它的文件之一是我的FileIO
对象。这将处理存在外部文件而不是原始数据的情况。我似乎遇到的问题是两个对象之间的接口。我的目的是能够使用FileIO
中的readDataFromFile
功能读取文件;组织FileIO
对象内的数据;然后将该数据传递到TestData
对象,在该对象中可以对其进行梳理以进行最终验证,然后将其写入单独的外部文件
classdef FileIO < TestData
methods
function this = readDataFromFile(this, thisFile)
[filepath, name, ext] = fileparts(thisFile);
inFile = textread(thisFile, '%s', 'delimiter', '\n');
this = this.setMetaDataFromFile(inFile, ext);
myTestData = TestData;
myTestData.metaData = this;
end %readDataFromFile
function this = setMetaDataFromFile(this, inFile, ext)
strForm = string(inFile);
if strcmp(ext, '.txt')
dataBegin = find(~cellfun(@isempty, strfind(inFile, 'start of data')));
metaDataBegin = find(~cellfun(@isempty, strfind(inFile, 'meta data')));
metaDataOutForm = strForm(metaDataBegin+1:dataBegin-4);
metaDataOutForm = cellfun(@(x)strsplit (x, '='), metaDataOutForm, 'UniformOutput', false);
this.metaData = cat(1,metaDataOutForm{:});
end
end
end % Methods
end % Class
classdef FileIO
我试着继承,我已经绞尽脑汁想了一段时间,但我似乎找不到解决办法。我可以从非类的其他文件中毫无问题地执行此操作,这就是为什么我认为它与尝试交互的两个对象有关。我对TestData
创建实例的那一行和它正下方的那一行只是我尝试解决这个问题的众多尝试之一
提前谢谢你的帮助。如果还有什么我可以提供的,请告诉我 我认为这里没有继承的必要
与当前代码最接近的解决方案如下:
classdef FileIO
properties
metaData = []; % stores meta data in Nx2 array
end
methods
function myTestData = readDataFromFile(this, thisFile)
[filepath, name, ext] = fileparts(thisFile);
inFile = textread(thisFile, '%s', 'delimiter', '\n');
this = this.setMetaDataFromFile(inFile, ext);
myTestData = TestData;
myTestData.metaData = this.metaData;
end %readDataFromFile
function this = setMetaDataFromFile(this, inFile, ext)
% ...
end
end % Methods
end % Class
这里,FileIO.readDataFromFile
返回一个TestData
对象。你会写:
myFileIO = FileIO;
myTestData = myFileIO.readDataFromFile('filename');
但我认为这是一个非常丑陋的类用法,如果你创建一个对象,调用其中的单个函数,然后再也不使用该对象,这意味着你需要一个自由函数:
function myTestData = readDataFromFile(this, thisFile)
[filepath, name, ext] = fileparts(thisFile);
inFile = textread(thisFile, '%s', 'delimiter', '\n');
metaData = getMetaDataFromFile(inFile, ext);
myTestData = TestData;
myTestData.metaData = metaData;
function metaData = getMetaDataFromFile(inFile, ext)
% ...
这里,getMetaDataFromFile
是一个私有函数(假设您不需要单独调用它)。现在你只要做:
myTestData = readDataFromFile('filename');
请注意,自由函数版本更容易调用(不需要创建一个您并不真正使用的对象),其代码更短,因为它周围没有classdef
另一种选择是使readDataFromFile
成为TestData
类的方法。请注意,您可以简单地将上面创建的函数移动到目录@TestData
中,使其成为一种方法,它不需要写入classdef
文件中。好的,我的印象是每个.m
文件只能有一个函数。那么,您的建议是否意味着只要文件中的其他函数是私有的(即,它们仅由文件保存为的函数访问),文件中就可以有多个函数?另外,总共有四个函数:元数据
,数据
,协作
,colUnits
;所以每一个都被称为。现在,我在TestData
对象中有了这些,它们工作了,但是在我编写setter和getter之后,它们并不高兴。它看起来很凌乱,所以我移动了它们。@DymaxionFuller:事实上,您可以在同一个文件中定义其他私有函数。这对构建代码有很大帮助。如果需要编写多个函数共享的私有函数,请在子目录private
中创建一个M文件。我被要求设计一个对象,使其具有一个构造函数,该构造函数将元数据、标签、单位和数据作为参数。然而,当我想要导入一个文件时,这会带来一个问题,因为在处理之前,我不会知道任何东西的值。你的建议是什么?您会在对象外部实现不同的函数吗?或者在调用一些将数组初始化为[]
的“通用”构造函数之后,是否有办法读取文件并设置数组?@DymaxionFuller:采用元数据+标签+单位+数据或文件名的构造函数如何?在构造函数中,您可以测试输入参数类型的数量,并执行一项或另一项操作。构造函数也可以调用自己,这听起来可能很奇怪,但是你可以在构造函数中这样做TestData
:如果nargin==1&&ischar(varargin{1}),out=TestData(load(varargin{1})),return,end
,那么我有一个函数readDataFromFile
,它是TestData
的成员函数,我可以在if
语句中调用它吗?另外,load
不起作用,因为它是我要导入的.txt
文件,从我读到的内容来看,每一行都必须以注释开头才能起作用。所以我使用了this=TestData(textscan(varargin{1},“%s”
)。这可以编译,但是我仍然需要调用readDataFromFile
函数来筛选文件并对数组进行排序。如果你需要更好的理解,我很乐意再发一篇文章,向你展示更多的代码。非常感谢。
myTestData = readDataFromFile('filename');