1

我正在尝试将双精度向量分配给结构。我有一个Struct1(1).Data(1:end).Date包含 4030个NaN值的结构。我有一个称为双精度的向量,Dates其中包含存储为双精度的 4030 个日期。Dates我该如何分配Struct1(1).Data(1:end).Date

一般来说,我似乎在理解如何在结构、向量和元胞数组之间进行分配时遇到了问题(我不明白(vs {vs的使用[)。有人可以告诉我如何解决上述具体问题和/或用清晰的例子指出我想要完成的事情的一个很好的描述吗?

4

2 回答 2

3

最终,您需要一个逗号分隔的列表,以便清晰地分配给结构数组的每个值。但是,双精度值不返回逗号分隔的列表,而只是返回数组本身或某个子集。为此,您需要首先将双精度向量转换为元胞数组,以便将向量的每个值放入其自己的独立元胞中,该元胞可以“处理”给结构的每个数组。您可以使用 num2cell 执行此操作。例如:

% Setup the data (also uses the num2cell technique)
nans = num2cell(NaN(1,4030));
s = struct;
[s.Data(1:numel(nans)).Date] = nans{:}

% Now assign valid data (note that since the structure is already allocated
% to the right size we can just use (:)
dates = num2cell(rand(size(s.Data)));
[s.Data(:).Date] = dates{:}

这个页面有一些关于逗号分隔列表及其与结构、单元格的关系以及以这种方式处理它们的输出值的好信息。

于 2013-07-26T20:30:48.557 回答
2

我觉得你真的在滥用结构数组。您可能需要重新考虑数据的组织方式。您可能会发现MathWorks 中的这段视频很有帮助(评论也一样)。

首先让我们建立一个结构数组的示例结构数组,就像你拥有的那样

Struct1 = struct;
Struct1.Data = struct;
for i = 1:3
    Struct1(1).Data(i).Date = rand(1,9); % Random values instead of dates for demo
end

所有三个日期字段都可以通过以下方式输出到一个单元格数组中

dates = {Struct1(1).Data(:).Date}

这给出了:

dates = 

    [1x9 double]    [1x9 double]    [1x9 double]

如果所有单元格的大小相同,您可以将它们转置或将它们连接成一个矩阵。

现在,如果要更改存储在每个 Date 实例中的值,可以使用:

dates2 = {rand(4,1),rand(5,1),rand(6,1)}; % Create new cell array of random data
[Struct1(1).Data(:).Date] = dates2{:};    % set cell contents to each field

现在,再次输出为元胞数组 ( dates3 = {Struct1(1).Data(:).Date}) 返回您刚刚存储的内容

dates3 = 

    [4x1 double]    [5x1 double]    [6x1 double]

是的,它非常混乱和混乱。

于 2013-07-26T19:52:44.180 回答