【问题标题】:Adding an arbitrary number of functions into a function handle MATLAB将任意数量的函数添加到函数句柄中 MATLAB
【发布时间】:2012-07-24 19:06:26
【问题描述】:

我正在尝试在 MATLAB 中生成 .bmp 图形,但无法将函数相加。我正在设计我的函数,使得给定任意一组输入,我的函数将添加任意数量的函数并输出一个函数句柄。输入是我的一般函数的系数,因此我可以指定任意数量的函数(仅因系数而异),然后将它们一起添加到函数句柄中。我试图做的是将每个函数创建为字符串,然后将它们连接起来,然后将它们写为函数句柄。主要问题是因为 x 和 y 未定义(因为我正在尝试创建函数句柄)MATLAB 无法定期添加它们。我目前的尝试:

    function HGHG = anyHGadd(multi) %my array of inputs
    m=length(multi);
    for k=3:3:m;
    m1=multi(k-2); %these three are the coefficients that I'd like to specify
    n1=multi(k-1);
    w1=multi(k);
    HGarrm1=hermite(m1); %these generate arrays
    HGarrn1=hermite(n1);
    arrm1=[length(HGarrm1)-1:-1:0];%these generate arrays with the same length
    arrn1=[length(HGarrn1)-1:-1:0];%the function below is the general form of my equation
    t{k/3}=num2str(((sum(((sqrt(2)*x/w1).^arrm1).*HGarrm1))*(sum(((sqrt(2)*y/w1).^arrn1).*HGarrn1))*exp(-(x^2+y^2)/(w1^2))));
    end
    a=cell2mat(t(1:length(t)));
    str2func(x,y)(a);

任何帮助将不胜感激。我在这里没有看到太多关于此的内容,我什至不确定这是否完全有可能。如果我的问题不清楚,请说出来,我会再试一次。

编辑:倒数第四行不应产生数字,因为未定义 x 和 y。它们不可能是因为我需要将它们保留为我的函数句柄的一部分。至于我的代码的精简版本,希望这能说明问题:

    function HGHG = anyHGadd(multi) %my array of inputs
    m=length(multi);
    for k=3:3:m;
    m1=multi(k-2); %these three are the coefficients that I'd like to specify
    n1=multi(k-1);
    w1=multi(k);
    t{k/3}=num2str(genericfunction(x,y,n1,m1,n1,w1); %where x and y are unspecified
    end
    a=cell2mat(t(1:length(t)));
    str2func(x,y)(a);

编辑 我希望这会输出一个函数句柄,它是我的任意数量的函数的总和。但是,我不确定使用字符串是否是最好的方法。

【问题讨论】:

  • 你能发布一个精简版的代码吗?此外,据我所知,最后 4 行 t{k/3} = ... 产生一个数字......这怎么可能是方程的一般形式?
  • 您希望从多个句柄中得到什么样的输出?
  • 你试过symbolic variables吗?
  • 如果xy 没有定义,你不能调用genericfunction!在我看来,你的第四行倒数第二行应该是t{k/3} = @(x,y)genericfunction(x,y,n1, m1, n1, w1);

标签: function matlab anonymous-function variadic-functions function-handle


【解决方案1】:

您的问题对我来说不是很清楚,但我认为您正在尝试创建一个函数,该函数会生成由某些输入参数化的输出函数。

一种方法是使用closuresnested function 访问其父函数工作区)。我举个例子来说明:

function fh = combineFunctions(funcHandles)
    %# return a function handle
    fh = @myGeneralFunction;

    %# nested function. Implements the formula:
    %# f(x) = cos( f1(x) + f2(x) + ... + fN(x) )
    %# where f1,..,fN are the passed function handles 
    function y = myGeneralFunction(x)
        %# evaluate all functions on the input x
        y = cellfun(@(fcn) fcn(x), funcHandles);

        %# apply cos(.) to the sum of all the previous results
        %# (you can make this any formula you want)
        y = cos( sum(y) );
    end
end

现在假设我们要创建函数@(x) cos(sin(x)+sin(2x)+sin(5x)),我们会调用上面的生成器函数,并给它三个函数句柄,如下所示:

f = combineFunctions({@(x) sin(x), @(x) sin(2*x), @(x) sin(5*x)});

现在我们可以在给定任何输入的情况下评估这个创建的函数:

>> f(2*pi/5)         %# evaluate f(x) at x=2*pi/5
ans =
     0.031949

注意:返回的函数将作用于标量并返回一个标量值。如果您希望它矢量化(以便您可以一次将其应用于整个矢量f(1:100)),您必须在cellfun 中将UniformOutput 设置为false,然后将这些矢量组合成一个矩阵,对它们求和沿着正确的维度,并应用您的公式来获得矢量结果。

【讨论】:

  • 在您的情况下,您还可以让makeFunc 接受函数句柄并编写嵌套函数来评估每个函数并返回它们的总和
  • 不幸的是,您的“makeFunc”不会生成任意数量的函数来相加。虽然我想这不会是一个艰难的解决方案。
  • @NickM:看我更新的例子,你可以传递存储在一个单元数组中的任意数量的函数句柄,它会创建一个新函数作为所有应用的总和
  • @NickM:为了简单起见,我省略了参数,但是如果您想进行加权求和,例如可以再次添加它们
  • 我用这种方法看到的问题是我无法对总和进行操作。我需要以这种方式求和的原因之一是我需要对求和作为一个整体进行操作,而不是对它的组成部分进行操作。
【解决方案2】:

如果您的目标是创建一个函数句柄,对任意数量的函数的输出求和,您可以执行以下操作:

n = 3; %# number of function handles
parameters = [1 2 4];
store = cell(2,3);

for i=1:n
  store{1,i} = sprintf('sin(t/%i)',parameters(i));
  store{2,i} = '+'; %# operator
end

%# combine such that we get
%# sin(t)+sin(t/2)+sin(t/4)
funStr = ['@(t)',store{1:end-1}]; %# ignore last operator

functionHandle = str2func(funStr)

functionHandle = 

    @(t)sin(t/1)+sin(t/2)+sin(t/4)

【讨论】:

  • 在您将单元格元素组合在一起的“funStr”行中,我遇到了一个问题,即数组的元素根本不会被写为字符串,而这部分被忽略了完全。例如。我得到 '@(x,y)' 但不是 '@(x,y)(cell elements)'
  • @NickM:当我运行我的示例时,它运行良好。您的问题与示例有关,还是与您的功能有关?如果是后者:确保sprintf 语句正确地返回一个字符串表示你的和数(正确填写参数 - 你可能需要使用 %f 作为格式字符串!)
猜你喜欢
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多