我正在使用一个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_Datafieldnames(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库的作者。
请随意将此代码编辑为您自己的解决方案答案;与其说它是一个答案,不如说它是一个支持诊断的答案。

07-24 09:25