2

我从一个 FITS-Table 读取数据,并获得一个包含该表的 Struct,其中每个标签代表一列。

有没有办法将数组结构重新格式化为结构数组?那么 Array 中的一个 Struct 代表一个 Row 吗?


@mgalloy 提出的一般解决方案(见下文):

function SoA2AoS, table

  if (table eq !NULL) then return, !NULL

  tnames = tag_names(table)
  new_table = create_struct(tnames[0], (table.(0)[0]))
  for t = 1L, n_tags(table) - 1L do begin
    new_table = create_struct(new_table, tnames[t], (table.(t))[0])
  endfor

  new_table = replicate(new_table, n_elements(table.(0)))

  for t = 0L, n_tags(table) - 1L do begin
    new_table.(t) = table.(t)
  endfor

  return, new_table

end
4

3 回答 3

1

您也可以在不知道标签名称的情况下执行此操作(未经测试的代码):

; suppose table is a structure containing arrays
tnames = tag_names(table)
new_table = create_struct(tnames[0], (table.(0))[0]
for t = 1L, n_tags(table) - 1L do begin
  new_table = create_struct(new_table, tnames[t], (table.(t))[0])
endfor
table = replicate(table, n_elements(table.(0)))
for t = 0L, n_tags(table) - 1L do begin
  new_table.(t) = table.(t)
endfor
于 2015-04-25T18:17:42.080 回答
1

是的,所以你有这样的东西?

IDL> table = { a: findgen(10), b: 2. * findgen(10) }

创建一个新表,它定义单行的外观并将其复制适当的次数:

IDL> new_table = replicate({a: 0.0, b: 0.0}, 10)

然后复制列:

IDL> new_table.a = table.a
IDL> new_table.b = table.b

您的新表可以按行或列访问:

IDL> print, new_table[5]
{      5.00000      10.0000}
IDL> print, new_table.a
  0.00000      1.00000      2.00000      3.00000      4.00000      5.00000      6.00000
  7.00000      8.00000      9.00000
于 2015-04-24T17:03:25.307 回答
1

mgalloy 的解决方案也帮助了我。由于无法添加评论,我已经用修复更新了他的代码。

; suppose table is a structure containing arrays
tnames = tag_names(table)
new_table = create_struct(tnames[0], (table.(0))[0])
for t = 1L, n_tags(table) - 1L do begin
   new_table = create_struct(new_table, tnames[t], (table.(t))[0])
endfor
new_table = replicate(new_table, n_elements(table.(0)))
for t = 0L, n_tags(table) - 1L do begin
   new_table.(t) = table.(t)
endfor
于 2017-09-20T15:54:32.873 回答