3

我正在使用 Matlab API 将数据从专有格式加载到一系列结构中。这是加载文件后数据集的示例:

>>字段名(数据(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'

我想遍历所有data(i).BT_Data(j). 我已经得到了data罚款的长度,但我无法得到BT_Data(每个都不同data(i))的大小/长度:

>> 长度(数据(1).BT_Data)

答案=

 1

>> 大小(数据(1).BT_Data)

答案=

 1     1

我在这里的预期结果是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 .');
setenv('XML_RW_API_HOME','/opt/rwapi-matlab/lib/rwapi');
路径(路径,'/opt/rwapi-matlab');

>> 产品 = RWAPI.product('SM_OPEB_MIR_SCLF1C_20110202T013659_20110202T014642_346_060_1')

Array SMOS Matlab 接口版本 1.4
(c) 2010 Array Systems Computing Inc. of Canada ( 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: []

方法、事件、超类

>> 数据 = 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

>> whos
名称大小字节类属性

ans 1x1 1 逻辑
数据 1x19091 112 RWAPI.dataset
prod 1x2 112 RWAPI.product

4

3 回答 3

2

我找到了一种解决方法,尽管它并不是非常令人满意:

>> a = 数据(1).BT_Data

一个=

BT_Data: [1x66 struct]

>> 长度(a.BT_Data)

答案=

66

我暂时将其标记为答案,因为我怀疑是否会有任何其他“正确”的方法来做到这一点。

安德鲁的回答确实解决了这个问题(以及为什么这种解决方法有效)。

于 2011-02-04T19:30:53.540 回答
2

好的,我真的怀疑在那些 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 库作者。

随意将此代码编辑为您自己的解决方法答案;这与其说是一个真正的答案,不如说是支持诊断。

于 2011-02-04T20:40:54.017 回答
1

你的一些结果似乎是矛盾的。对于初学者,如果该字段BT_Data包含一个 1×66 结构数组,我希望看到如下输出:

>> data(1).BT_Data

ans =

1x66 struct array with fields:
     Flags
     ...    %# etc.

你看到这个的事实:

>> data(1).BT_Data

ans =

BT_Data: [1x66 struct]

向我建议这BT_Data实际上是一个 1×1 结构,其中有一个名为 的字段BT_Data,并且字段包含一个 1×66 结构数组。这将解释当您获得第一个BT_Data(1×1 结构)的长度和大小时所看到的内容。如果是这种情况,您应该得到以下结果:

>> size(data(1).BT_Data.BT_Data)

ans =

     1     66

但是,这仍然不能解释您这样做时看到的输出:

fieldnames(data(1).BT_Data(1))

这让我失望了。您可能希望通过执行以下操作检查它BT_Data实际上是一个结构,而不是可能具有不同索引和显示行为的其他类型的对象:

isstruct(data(1).BT_Data)

这应该返回一个1ifBT_Data是一个结构。

于 2011-02-03T22:47:57.483 回答