首页 > 解决方案 > 通过“行”构建 Octave 结构

问题描述

我的意思是使用一个结构来保存一个“表”:

% Sample data
% idx  idxstr  var1  var2  var3
%   1    i01    3.5  21.0   5
%  12    i12    6.5   1.0   3

第一行包含字段名称。我可以直接按列输入这些数据,

ds2 = struct( ...
    'idx', { 1, 12 }, ...
    'idxstr', { 'i01', 'i12' }, ...
    'var1', { 3.5, 6.5 }, ...
    'var2', { 21, 1 }, ...
    'var3', { 5, 3 } ...
);

并间接通过行,创建一个单元格数组,并转换为结构,

ds3 = cell2struct( ...
  { 1, 'i01', 3.5, 21.0, 5; ...
    12, 'i12', 6.5, 1.0, 3 ...
  }, { 'idx', 'idxstr', 'var1', 'var2', 'var3' }, 2 );

有没有直接按行输入数据的方法?

另外, 为什么大小不一样?

>> size(ds2), size(ds3)
ans =

   1   2

ans =

   2   1

标签: structoctave

解决方案


正如我在您的另一篇文章中提到的您最好将“表”创建为数组字段的结构,而不是单行结构的数组。

但是,为了写出有用的答案,我假设您选择此表单开始的原因可能是您已经将数据作为“单元格”形式的行(例如,可能是csv2cell操作的输出),并且您想将其转换为这样的“表格”。

因此,要从这样的数据结构创建一个漂亮的“作为数组结构的表”,您可以遵循如下策略:

Data = { 1, 'i01', 3.5, 21.0, 5;   12, 'i12', 6.5, 1.0, 3 };
d1 = struct( 'idx'   ,  [Data{:,1}] ,
             'idxstr', {{Data{:,2}}},   % note the 'enclosing' braces!
             'var1'  ,  [Data{:,3}] ,
             'var2'  ,  [Data{:,4}] ,
             'var3'  ,  [Data{:,5}]
           );

或者,cell2struct如果您更喜欢该语法,请使用:

d2 = cell2struct( { [Data{:,1}],
                    {Data{:,2}},   % note the lack of enclosing braces here!
                    [Data{:,3}],
                    [Data{:,4}],
                    [Data{:,5}] },
                  { 'idx', 'idxstr', 'var1', 'var2', 'var3' },
                  2
                );

请注意,您“确实”需要知道“列”是否表示数字或字符串数​​组,以便分别将其包装在 [] 或 {} 中......但我认为知道每列表示的数据类型不是程序员的不合理要求。


推荐阅读