1

我有一个函数可以计算一个数字数组(randparam),我想将它逐个元素地输入到另一个进行模拟的函数中。

例如

function [randparam] = arraycode

code 

randparam = results of code 
% randparam is now a 1x1001 vector. 

end

接下来我想将 randparam 1 by 1 输入到我的模拟函数中

function simulation 

x = constant + constant * randparam + constant

return 
end

让我感到困难的是因为模拟函数中的return命令,它只计算上面方程x的一步,将结果返回到另一个函数,调用它积分器,然后积分器函数会再次调用模拟函数来计算 x。

所以积分器功能可能看起来像

function integrator (x)
y = simulation(x) * 5
u = y+10
yy = simulation(x) * 10 + u

end

如您所见,积分器函数调用了模拟函数两次。这给我带来了两个问题:

  1. 如果我在模拟函数中创建一个 for 循环,在其中我使用以下内容逐个元素输入:

    对于 i = 1:100

    x = 常数 + 常数 * randparam(i) + 常数

    返回

然后每次我的积分器函数再次调用我的模拟函数时,我的 for 循环又从 1 开始。

2.如果我如何将 i 保存在我的基本工作区中,以便我的模拟函数中的 for 循环知道从 1 开始,那么我的 y 和 yy 函数将具有不同的 x 输入,因为一旦它被称为第二个yy 的时间,那么由于 y 的来电,我现在是 i+1。

在这种情况下有没有办法避免 for 循环?第二个问题的一个潜在解决方案是复制脚本但使用不同的名称,并让我的 for 循环使用不同的变量,但这似乎效率很低。

希望我说清楚了。

谢谢。

4

2 回答 2

3

首先,如果您通常希望对数组的每个元素应用相同的函数并且还没有内置的矢量化方式来执行此操作,您可以使用arrayfun(尽管通常一个简单的for循环更快且更具可读性):

%# randparam is a 1x1001 vector. 
%#next I want to input randparam 1 by 1 into my simulation function
function simulation 
    x = constant + constant * randparam + constant
    return 
end

(注意:问问自己这个函数可能在做什么,因为它没有返回值并且 MATLAB 不会通过引用传递。)这是arrayfun为了:将函数应用于数组(或向量,在这种情况下)。同样,您应该确保在您的情况下这样做是有意义的,而不是显式循环。

function simulation(input_val)
#% your stuff
end


sim_results = arrayfun( @simulation, randparam);

当然,你写的方式,行

x = constant + constant*randparam + constant;

可以(并且将)向量化 - 如果你给它一个向量或矩阵,一个向量或矩阵将是结果。

其次,您似乎不清楚 MATLAB 中函数变量的“范围”。如果调用函数,则会创建一个干净的工作区。因此x,从一个函数不会自动在您调用的另一个函数中可用。变量在函数末尾也会超出范围,因此x在函数内使用不会更改/覆盖x该函数外部存在的变量。一个函数的多次调用每个都有自己的工作区。

于 2012-06-13T00:32:36.130 回答
0

积分器级别的循环有什么问题?

function integrator (x)

for i=1:length(x)
    y = simulation(x(i)) * 5
    u = y+10
    yy = simulation(x(i)) * 10 + u
end

并将您的整个 randparm 传递给积分器?从您的问题中不清楚您是否希望simulation在给定相同输入时返回相同的值,或者您是否希望它使用相同的输入执行两次,或者您是否希望每次调用都有新的输入。也不清楚是否simulation保持任何内部状态。按照您编写示例的方式,模拟仅取决于输入值,而不取决于任何先前的输入或输出,这使得矢量化变得微不足道。如果我们都错过了这条船,请使用更精致的示例代码编辑您的问题。

于 2012-06-13T13:17:27.077 回答