![]() |
Matlab(R2010a 64位linux)中另一个结构中结构的大小
我正在使用Matlab API,该API将专有格式的数据加载到一系列结构中。这是加载文件后数据集的示例:
[INDENT] >> fieldnames(数据(1)) 回答= 'Grid_Point_ID' 'Grid_Point_Latitude' 'Grid_Point_Longitude' 'Grid_Point_Altitude' 'Grid_Point_Mask' 'BT_Data' >>数据(1).BT_Data 回答= BT_Data: [1x66 struct] >>字段名称(数据(1).BT_Data(1)) 回答= 'Flags' 'BT_Value_Real' 'BT_Value_Imag' 'Pixel_Radiometric_Accuracy' 'Incidence_Angle' 'Azimuth_Angle' 'Faraday_Rotation_Angle' 'Geometric_Rotation_Angle' 'Snapshot_ID_of_Pixel' 'Footprint_Axis1' 'Footprint_Axis2' [/INDENT]我想遍历所有data(i).BT_Data(j) 。我已经有足够的data长度,但是我无法获得BT_Data的大小/长度(每个data(i) ): [INDENT] >>长度(数据(1).BT_Data) 回答= 1 >>大小(数据(1).BT_Data) 回答= 1 1 [/INDENT]我的预期结果是ans = 66 (或size()等效数组)。 我对结构数据格式不是很熟悉,这可能是我挣扎的一部分。但是length(data)很好用,所以我很困惑为什么它不能在BT_Data工作(我也尝试过BT_Data(:) )。 我可以找到的最相关的先前答案是[URL="https://stackoverflow.com/questions/1757250/matlab-determine-total-length-size-of-a-structure-array-with-fields-as-structure"]1757250[/URL] ,但我无法使其正常工作(我认为它不适用于此处)。感谢您提供的任何见解。 ------编辑------ 关于我如何使用API甚至达到我所要达到的目的,这里有一些更多的见解: [INDENT] >> system('ln -sf /opt/rwapi-matlab/lib/rwapi/smos/config/xml_rw_api.usr_conf.xml。'); setenv('XML_RW_API_HOME','/ opt / rwapi-matlab / lib / rwapi'); 路径(路径,'/ opt / rwapi-matlab'); >>产品= RWAPI.product('SM_OPEB_MIR_SCLF1C_20110202T013659_20110202T014642_346_060_1') 阵列SMOS Matlab接口1.4版 (c)2010年加拿大Array Systems Computing Inc.( [URL]http://www.array.ca[/URL] ) 分发或修改此软件需要Array的书面许可 产品= RWAPI.product handle Package: RWAPI Properties: filename: 'SM_OPEB_MIR_SCLF1C_20110202T013659_20110202T014642_346_060_1' header: [1x1 struct] xml_datablock: [] 方法,事件,超类 >>数据= prod.dataset(2) 数据= 没有属性的RWAPI.dataset句柄。包装:RWAPI 方法,事件,超类 >>数据(1) 回答= Grid_Point_ID: 251721 Grid_Point_Latitude: 25.5000 Grid_Point_Longitude: -102.2590 Grid_Point_Altitude: 1.4714e+03 Grid_Point_Mask: 2 BT_Data: [1x66 struct] >>数据(1).BT_Data 回答= BT_Data: [1x66 struct] >>数据(1).BT_Data(1) 回答= Flags: 6229 BT_Value_Real: 262.5275 BT_Value_Imag: 0 Pixel_Radiometric_Accuracy: 6160 Incidence_Angle: 31966 Azimuth_Angle: 10299 Faraday_Rotation_Angle: 65277 Geometric_Rotation_Angle: 58605 Snapshot_ID_of_Pixel: 65752530 Footprint_Axis1: 19649 Footprint_Axis2: 14625 >>谁 名称大小字节类属性 ANS 1X1 1逻辑 数据1x19091 112 RWAPI.dataset 产品1x2 112 RWAPI.product [/INDENT] [B]回答:[/B] 好的,我真的怀疑这是那些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库作者。 随意编辑此代码为您自己的解决方法答案;支持诊断本身并不是一个真正的答案。 [url=https://stackoverflow.com/questions/4892277]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 23:25。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.