- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 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 Arrayprod =
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 Attributesans 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_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 库作者。
随意将此代码编辑到您自己的解决方法答案中;与其说是支持诊断,不如说是真正的答案。
关于matlab - Matlab 中另一个结构内结构的大小(R2010a 64 位 linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4892277/
我是一名优秀的程序员,十分优秀!