【问题标题】:Extract values for all row, for given fieldname, from an Octave struct [duplicate]从 Octave 结构中提取给定字段名的所有行的值 [重复]
【发布时间】:2020-10-07 19:06:21
【问题描述】:

如何从 Octave struct 获取所有行的完整列(字段名)的所有值?

我会将它放入一个元胞数组或常规向量中,最好不要循环。

【问题讨论】:

    标签: struct field octave


    【解决方案1】:

    您似乎混淆了一些事情。部分原因是您将结构与“R dataframes / python pandas”进行了等效比较。

    结构体最好被认为类似于 python dicts、R 列表等。它们是一个特殊的对象,可以保存“字段”,可以通过“字段名”访问(或者通过键访问的值,如果你更喜欢)。

    此外,与 octave 中的任何其他对象一样,它们是数组的有效元素。这意味着你可以拥有这样的东西:

    octave:1> struct( 'name', { 'Tom', 'Jim'; 'Ann', 'Sue' }, 'age', { 20, 21; 22, 23 } )
    S =
      2x2 struct array containing the fields:
        name
        age
    

    一般来说,当处理这样一个结构 array 时,访问该数组的多个元素上的一个字段会产生一个comma separated list。例如

    octave:6> S(2,:).name
    ans = Ann
    ans = Sue
    

    这可以传递给(即“扩展为”)任何需要这种逗号分隔列表作为参数的函数。例如

    octave:7> fprintf( 'The girls names are %s, and %s.\n', S(2,:).name )
    The girls names are Ann, and Sue.
    

    如果需要,您还可以将该列表直接传递到“单元构造函数”中,以创建单元。 (尽管如果您希望它具有特定的形状,则必须在之后对其进行重塑)。例如

    octave:9> reshape( { S.age }, size(S) )
    ans =
    {
      [1,1] =  20
      [2,1] =  22
      [1,2] =  21
      [2,2] =  23
    }
    

    还有struct2cell,但这有一些不同。试试看它做了什么(例如C = struct2cell(S))。

    最后,为了避免混淆,考虑到当处理结构数组时,“列”指的是“数组”中的列,我会避免使用该术语来指代“字段名”。

    【讨论】:

    • 所指出的问题有(至少一个有效的)答案:myarr = [struc.field]
    • @sancho.sReinstateMonicaCellio 是的,这会生成一个逗号分隔的列表,并将其捕获在括号中,从而有效地创建一个水平数组。这实际上与我在这里更详细地展示的内容相同。但正如我在另一篇文章中所说,您可能不是在寻找结构数组。您可能正在寻找数组结构(这将是最接近数据框的东西)。有关详细信息,请参阅我的其他答案。
    • 太好了,我会检查的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2013-01-01
    相关资源
    最近更新 更多