我正在使用一个Matlab API,它将数据从专有格式加载到一系列结构中以下是加载文件后数据集的外观示例:
>>字段名(数据(1))
答复=
'Grid_Point_ID'
'Grid_Point_Latitude'
'Grid_Point_Longitude'
'Grid_Point_Altitude'
'Grid_Point_Mask'
'BT_Data'
>>数据(1).BT_数据
答复=
BT_Data: [1x66 struct]
>>字段名(数据(1).BT_数据(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'
我想循环所有
data(i).BT_Data(j)
我已经得到了data
的长度,但是我无法得到BT_Data
的大小/长度(每个data(i)
的长度都不同):>>长度(数据(1).BT_数据)
答复=
1
>>大小(数据(1).BT_数据)
答复=
1 1
我的预期结果是
ans = 66
(或size()
的等效数组)。我对结构数据格式不是很熟悉,这可能是我努力的一部分但是
length(data)
工作得很好,所以我很困惑为什么它不能在BT_Data
上工作(我也试过)。我之前找到的最相关的答案是1757250,但我无法让它工作(我认为这里不适用)感谢您提供的任何见解。
BT_Data(:)
编辑------
下面我们将更深入地了解如何使用API来达到以下目的:
>>系统('ln-sf/opt/rw api matlab/lib/rwapi/smos/config/xml_rw_api.usr_conf.xml');
setenv('XML_RW_API_HOME','/opt/rwapi matlab/lib/rwapi');
路径(路径,'/opt/rwapi matlab');
>>prod=RWAPI.产品('SM_OPEB_MIR_SCLF1C_20110202T013659_20110202t14642_346_060_1')
阵列SMOS Matlab接口版本1.4
(c)加拿大2010阵列系统计算公司(http://www.array.ca)
分发或修改此软件需要Array的书面许可
产品=
RWAPI.product handle
Package: RWAPI
Properties:
filename: 'SM_OPEB_MIR_SCLF1C_20110202T013659_20110202T014642_346_060_1'
header: [1x1 struct]
xml_datablock: []
方法、事件、超类
>>数据=生产数据集(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_数据
答案=
BT_Data: [1x66 struct]
>>数据(1).BT_数据(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逻辑
数据1x19091 112 RWAPI.dataset
产品1x2 112 RWAPI.产品
最佳答案
好吧,我真的怀疑在那些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
,你就得到了一个普通的结构,而非标准的subref就不起作用了使用getfield
可以在一行中获得相同的效果。>> btdata = getfield(data(1).BT_Data, 'BT_Data')
btdata =
1x66 struct array with fields:
foo
bar
我会将此作为一个可能的bug报告给RWAPI库的作者。
请随意将此代码编辑为您自己的解决方案答案;与其说它是一个答案,不如说它是一个支持诊断的答案。