2

摘要:我想调用一个返回多个结构n时间的函数。如何将结果附加到输出结构中的现有字段(即创建向量),而不是在每次迭代时创建包含标量的新字段?


示例:考虑一个函数sample_fct( x ),它 1) 执行一些操作x并将结果保存在几个新变量中(a以及b示例代码中),然后 2) 调用一些子函数calculate_one( x )calculate_two( x )使用ab作为输入。这些函数究竟是做什么的并不重要。然后将这些函数的输出收集到 structAB.

function [A, B] = sample_fct( x )
    a = 1 * x;
    b = 2 * x;
    [A.one, A.two] = call_functions( a );
    [B.one, B.two] = call_functions( b );
    function [one, two] = call_functions( input )
        one = calculate_one( input );
        two = calculate_two( input );
        function one = calculate_one( input )
            one = input.^2;
        end
        function two = calculate_two( input )
            two = input.^3;
        end
    end
end

然后我想n在我的脚本中使用不同的输入参数调用这个函数时间

n = 3;
for i = 1:n
    [A(i), B(i)] = sample_fct( i );
end

当我这样做AB成为 1*n 结构时,每个字段再次包含字段onetwo. 因此,在我的示例中,n = 3我有 3 个标量实例onetwo. 我的示例代码的输出如下所示:

>> A
A = 
1x3 struct array with fields:
    one
    two
>> A.one
ans =
     1
ans =
     4
ans =
     9

我真正想要的是AandB是 1*2 具有 1*n 个向量的结构体oneand two,所以所需的输出应该是这样的:

>> A
A = 
    two: [1 8 27]
    one: [1 4 9]

如果没有 [one, two] 作为我的函数的输出变量并且没有分别为 A 和 B 调用我的函数,我该如何做到这一点?


为什么要这样做:我想在时间序列上运行具有不同参数组合的预测模型,并计算 1 分钟、1 小时、1 天等表示的一些拟合优度度量和其他统计数据。在我的示例中,x将是时间序列、n不同参数向量上的循环a以及b具有不同采样时间的表示以及two我想在 structsAB. 我很确定有一种更复杂的方法可以做到这一点,但我就是无法理解它。

我知道用向量/矩阵而不是结构很容易做到这一点,但我希望能够用变量名而不是 A.hourly(:,19) 或类似的名称来调用我的输出,因为我计算了很多统计数据,而不仅仅是我的实际代码中的两个。

4

2 回答 2

3

编辑:根据评论中提到的错误进行更新。

您可以通过以下方式转换它们

A = struct('one', [A.one], 'two', [A.two]);

一般来说:

D = [fieldnames(A), cellfun(@(x) [A.(x)], fieldnames(A), 'Uni', false)].';
A = struct(D{:});

旧答案

您可以通过以下方式转换它们

A.one = [A.one];
A.two = [A.two];

一般来说

for theField = fieldnames(A)'
    F = theField{1};
    A.(F) = [A.(F)];
end
于 2013-08-12T13:18:57.210 回答
2

一种替代方法是让 sample_fct 将 A 和 B 作为附加参数并在 sample_fct 内进行附加:

[A,B] = sample_fct(1)
for i=2:n
    [A,B] = sample_fct(i, A, B)
end

在 3-arguments-call 的情况下,您必须更改call_functionssample_fct 中的两个调用。这可能看起来像这样:

if nargin == 3
    [A.one(end+1), A.two(end+1)] = call_functions( a );
    [B.one(end+1), B.two(end+1)] = call_functions( b );
elseif nargin == 1
    [A.one, A.two] = call_functions( a );
    [B.one, B.two] = call_functions( b );
end

作为一般评论:在这种情况下,我没有看到使用嵌套函数的任何理由,因此我建议宁愿将它们实现为同一个 m 文件中的普通子函数。

于 2013-08-12T14:13:14.463 回答