【问题标题】:Is there a way to convert a double array to a struct array?有没有办法将双数组转换为结构数组?
【发布时间】:2020-08-03 18:06:02
【问题描述】:

有没有办法将双精度数组转换为结构数组并将其放在一个字段下?

例如,假设我们从cellfun 的调用中得到一个双精度数组,输出数组看起来像

data=[1,2;3,4];

我们可以在哪里获得struct S 吗

S=struct;
for i=1:numel(data)
        S(i).data=data(i);
    end
end

使用本机函数还是有效地获取 S? (最后是视觉效果)

如果有方法,得到的struct数组是否可以保留原始双精度数组的维度?该方法能否应用于cellfun的输出,其中输出为双精度数组?

在我的特定应用程序中,我的data 是对cellfun 的调用的(统一)输出,当我设置S.data=cellfun(...) 时,结果是一个单元素结构数组,其中S.data 是m-来自cellfun(...) 的 by-n 双数组。如何分配数组元素?

(我手头的任务涉及每个查询处理 10k 个数据点,每个任务大约有 16 个查询。所以速度很重要。如果没有有效的方法,我会知道避免 struct 用于这种特定类型的任务. 所以这方面的 cmets 也很有帮助。)

【问题讨论】:

  • 仅供参考:这是非常低效的记忆方式。每个矩阵都有 114 字节的开销(截至 R2017a,不确定这是否最近发生了变化)。因此,具有单个双精度值的矩阵占用 122 个字节。每个单元格为单个值的单元格数组,或每个元素为单个值的结构体数组,因此每个元素至少占用 122 个字节(加上单元格数组或结构在其之上添加的任何开销)。因此,不是每个元素使用 8 个字节,而是使用 122 个,超过 15 倍的内存。
  • @CrisLuengo:感谢您的参与!这些信息对我很有帮助。我会记住的。

标签: arrays matlab struct


【解决方案1】:

使用structnum2cell

data = [1,2;3,4];
S = struct ('data', num2cell(data));

【讨论】:

  • @Argyll:您添加的cellfun 解决方案可能要慢得多。
  • @CrisLuengo:即使从cellfun开始? 'UniformOuput', true + num2cell 会比 'UniformOuput', false 快吗?我知道我以cellfun 开头可能听起来很奇怪。在这方面,我别无选择。这是与第三方 API 交互的开始。
  • @Argyll 我认为您编辑了我的帖子,而不是将您的笔记作为评论发布。我回滚了更改。
  • @Argyll: cellfun 为每个单元调用一个函数句柄,这会带来很大的开销。 rahnema1 的解决方案很简单,可能是您可以构建的最有效的解决方案。 num2cell 创建了一个元胞数组,但它的每个元素(单值矩阵)都将在结构中重复使用(MATLAB 的延迟复制),所以即使它看起来像双重工作(矩阵 -> 元胞数组 -> 结构数组),这不是很多开销。
  • @rahnema1:好的。 Np.
【解决方案2】:

由于您希望矩阵的每个元素都有一个单独的字段,我不得不说:不,没有标准的解决方案。如果您不是绝对需要它,我不建议您这样做,请参阅this post。它只是需要更多的内存,而且看的时候有点痛苦。

尽管如此,这是可能的,但你必须以一个字符开始你的字段的每个名称。

data = [1,2;3,4];
% create empty struct
S = struct();
%% create new structure
for i = 1:length(data)
    % create field name (must start with a character!)
    fld = num2str(i,'F%d');
    % write to field (note the brackets)
    S.(fld) = data(i);
end

我的情况,你想通过循环访问数据,使用 MATLAB-buildin 函数fieldnames 是一种比自己构建文件名更通用的方法(并避免在删除一个字段时出现不足;))

%% access new structure (looping over field names)
% get all field names
FlNms = fieldnames(S);
for i = 1:length(FldNames)
    % access field names (this is a cell!)
    fld = FldNms{i};
    % access struct
    data_element = S.(fld);
    % do something
end

【讨论】:

  • 您好,感谢您的回复。对不起,我很难理解。每个查询,我可能会将 6 个 n×1 双精度数组存储到一个具有 6 个字段的单个 n×1 结构数组中。我将重复相同类型的查询,但每次都会是一个新结构。还是很糟糕吗?
  • 将它存储在 n×6 矩阵中在内存方面总是更有效,并且可能在进一步处理方面比将数组填充到结构中更有效。如果你负担得起并且它可以帮助你保持代码的概览,那就继续使用结构
  • 没有。这又是一个更高的结构。如果您没有大数据,只需选择最适合您的结构
  • 那我暂时还是用桌子吧。不,我不会称我的数据集很大。一次只有十几个 10k×6 阵列。大到足以让我在处理数据时关心效率。但还不够大,不需要在这方面付出所有最后的努力。
  • 比表格是最方便的选项,因为您可以为列赋予有意义的名称(使您的代码更容易遵循),并且您仍然可以像单元格一样循环遍历它。
猜你喜欢
  • 1970-01-01
  • 2015-08-01
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多