MATLAB:嵌套函数和结构

时间:2013-08-12 12:27:36

标签: matlab struct nested

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


示例:考虑一个函数sample_fct( x ):1)在x上执行某些操作并将结果保存在几个新变量中a和{ {1}}在示例代码中)然后2)调用一些子函数bcalculate_one( x ),其中calculate_two( x )a作为输入。这些功能到底是什么并不重要。然后在结构bA中收集这些函数的输出。

B

然后我想在我的脚本

中使用不同的输入参数调用此函数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 A成为1 * n结构,每个字段再次包含字段Bone。因此,在我使用two的示例中,我有3个标量n = 3one实例。我的示例代码的输出如下所示:

two

我真正想要的是>> A A = 1x3 struct array with fields: one two >> A.one ans = 1 ans = 4 ans = 9 A是1 * 2个结构{1}和B的结构,所以所需的输出看起来像这样:

one

如果没有[one,two]作为我的函数的输出变量且没有单独调用A和B的函数,我究竟能做到这一点吗?


为什么我要这样做:我想在时间序列上运行具有不同参数组合的预测模型,并计算1分钟,1小时的一些拟合度度量和其他统计数据,1天等表示。在我的示例中,two将是时间序列,循环超过>> A A = two: [1 8 27] one: [1 4 9] 循环不同的参数向量,xn表示具有不同的采样时间和一个{ {1}}我希望在结构ab中收集的一些统计信息。我非常确定这是一种更为复杂的方法,但我无法绕过它。

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

2 个答案:

答案 0 :(得分:3)

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

您可以按

转换它们
A = struct('one', [A.one], 'two', [A.two]);

一般来说:

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

OLD ANSWER

您可以通过

转换它们
A.one = [A.one];
A.two = [A.two];

一般

for theField = fieldnames(A)'
    F = theField{1};
    A.(F) = [A.(F)];
end

答案 1 :(得分: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-参数调用,则必须更改sample_fct中的两个call_functions调用。这可以是例如看起来像这样:

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文件中将它们作为普通子函数实现。