摘要:我想调用一个返回多个结构n
次的函数。如何将结果附加到输出结构中的现有字段(即创建向量),而不是每次迭代创建包含标量的新字段?
示例:考虑一个函数sample_fct( x )
:1)在x
上执行某些操作并将结果保存在几个新变量中a
和{ {1}}在示例代码中)然后2)调用一些子函数b
和calculate_one( x )
,其中calculate_two( x )
和a
作为输入。这些功能到底是什么并不重要。然后在结构b
和A
中收集这些函数的输出。
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结构,每个字段再次包含字段B
和one
。因此,在我使用two
的示例中,我有3个标量n = 3
和one
实例。我的示例代码的输出如下所示:
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]
循环不同的参数向量,x
和n
表示具有不同的采样时间和一个{ {1}}我希望在结构a
和b
中收集的一些统计信息。我非常确定这是一种更为复杂的方法,但我无法绕过它。
我知道这很容易用向量/矩阵而不是结构,但我希望能够用变量名称而不是A.hourly(:,19)或类似的东西调用我的输出,因为我在我的实际代码中计算了许多统计数据而不仅仅是两个。
答案 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文件中将它们作为普通子函数实现。