gpt4 book ai didi

matlab - Matlab 中另一个结构内结构的大小(R2010a 64 位 linux)

转载 作者:太空宇宙 更新时间:2023-11-03 20:22:41 25 4
gpt4 key购买 nike

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

>>fieldnames(data(1))

ans =

'Grid_Point_ID'
'Grid_Point_Latitude'
'Grid_Point_Longitude'
'Grid_Point_Altitude'
'Grid_Point_Mask'
'BT_Data'

>> data(1).BT_Data

ans =

BT_Data: [1x66 struct]

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

ans =

'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)):

>> length(data(1).BT_Data)

ans =

 1

>> size(data(1).BT_Data)

ans =

 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');
path(path,'/opt/rwapi-matlab');

>> prod = RWAPI.product('SM_OPEB_MIR_SCLF1C_20110202T013659_20110202T014642_346_060_1')

Array SMOS Matlab Interface version 1.4
(c) 2010 Array Systems Computing Inc. of Canada (http://www.array.ca)
Distribution or modification of this software requires written permission from Array

prod =

RWAPI.product handle
Package: RWAPI

Properties:
filename: 'SM_OPEB_MIR_SCLF1C_20110202T013659_20110202T014642_346_060_1'
header: [1x1 struct]
xml_datablock: []

Methods, Events, Superclasses

>> data = prod.dataset(2)

data =

RWAPI.dataset handle with no properties. Package: RWAPI

Methods, Events, Superclasses

>> data(1)

ans =

       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]

>> data(1).BT_Data

ans =

BT_Data: [1x66 struct]

>> data(1).BT_Data(1)

ans =

                     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
Name Size Bytes Class Attributes

ans 1x1 1 logical
data 1x19091 112 RWAPI.dataset
prod 1x2 112 RWAPI.product

最佳答案

好吧,我真的怀疑那些 RWAPI 类中重写的 subsref 方法很奇怪。通过定义一个带有轻微病态 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,您就得到了一个正常的结构,并且非标准的 subsref 已经不在了。您可以使用 getfield 在单行代码中获得相同的效果。

>> btdata = getfield(data(1).BT_Data, 'BT_Data')
btdata =
1x66 struct array with fields:
foo
bar

我会将此作为可能的错误报告给 RWAPI 库作者。

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

关于matlab - Matlab 中另一个结构内结构的大小(R2010a 64 位 linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4892277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com