Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我正在使用Matlab API,该API将专有格式的数据加载到一系列结构中。这是加载文件后数据集的示例:
>> fieldnames(数据(1))我想遍历所有data(i).BT_Data(j) 。我已经有足够的data长度,但是我无法获得BT_Data的大小/长度(每个data(i) ): >>长度(数据(1).BT_Data)我的预期结果是ans = 66 (或size()等效数组)。 我对结构数据格式不是很熟悉,这可能是我挣扎的一部分。但是length(data)很好用,所以我很困惑为什么它不能在BT_Data工作(我也尝试过BT_Data(:) )。 我可以找到的最相关的先前答案是1757250 ,但我无法使其正常工作(我认为它不适用于此处)。感谢您提供的任何见解。 ------编辑------ 关于我如何使用API甚至达到我所要达到的目的,这里有一些更多的见解: >> system('ln -sf /opt/rwapi-matlab/lib/rwapi/smos/config/xml_rw_api.usr_conf.xml。');回答: 好的,我真的怀疑这是那些RWAPI类中重写的subsref方法的怪异之处。通过定义一个带有轻微病理性子参照的类,我能够重现您观察到的所有行为。 classdef stupidref %STUPIDREF Reproduce odd indexing behavior that jpatton saw. Buggy. properties BT_Data = repmat(struct('foo',42, 'bar',42), [1 66]); end methods function B = subsref(A,S) s = S(1); subs = s.subs; chain = S(2:end); switch s.type case '()' B = builtin( 'subsref', A, s ); if ~isempty(chain) B = subsref(B, chain); end case '.' % Non-standard behavior! if ~isempty(chain) && isequal(chain(1).type, '()') B = subsref(A.(s.subs), chain); else B = struct(s.subs, A.(s.subs)); end end end end end 这与data(1).BT_Data和fieldnames(data(1).BT_Data(1))之间的怪异差异以及重复添加“ .BT_Data”的制表符完成一致。 >> data = stupidref; >> data(1).BT_Data ans = BT_Data: [1x66 struct] >> fieldnames(data(1).BT_Data) ans = 'BT_Data' >> fieldnames(data(1).BT_Data(1)) ans = 'foo' 'bar' >> length(data(1).BT_Data) ans = 1 >> data(1).BT_Data.BT_Data.BT_Data.BT_Data.BT_Data.BT_Data % produced by tab-completion ans = BT_Data: [1x66 struct] >> 您的解决方法是好的-调用a = data(1).BT_Data ,您将拥有一个普通的结构,并且非标准的subsref成为了障碍。使用getfield可以在一排中获得相同的效果。 >> btdata = getfield(data(1).BT_Data, 'BT_Data') btdata = 1x66 struct array with fields: foo bar 我会将此作为可能的错误报告给RWAPI库作者。 随意编辑此代码为您自己的解决方法答案;支持诊断本身并不是一个真正的答案。 更多&回答... |
![]() |
![]() |