1

我试图产生的.bmp MATLAB中的图形和我有麻烦总结功能结合在一起。我正在设计我的函数,使得给定一组任意的输入,我的函数将一起添加任意数量的函数并输出一个函数句柄。输入是我的通用函数的系数,所以我可以指定任意数量的函数(只因系数不同而不同),然后将它们一起添加到函数句柄中。我试图做的是将每个函数创建为一个字符串,然后将它们连接起来,然后将它们作为函数句柄进行编写。主要的问题是,因为x和y没有定义(因为我试图创建一个函数句柄),MATLAB不能定期添加它们。我目前的尝试:添加的功能的任意数量成函数手柄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); 

编辑我期待这对输出功能单一手柄是我的函数任意数量的总和。但是,我不确定使用字符串是否是最好的方法。

+0

你能发布您的代码的精简版?另外据我所见,第四行最后一行't {k/3} = ...'产生一个数字......这怎么可能是一个等式的一般形式? – jmetz 2012-07-24 19:17:48

+0

您希望从多个手柄获得什么样的输出? – Jonas 2012-07-24 19:59:49

+0

您是否尝试过[符号变量](http://www.mathworks.com/help/toolbox/symbolic/syms.html)? – Squazic 2012-07-24 20:03:16

回答

3

你的问题我不太清楚,但我想你正试图创建生成一些输入参数化输出功能的功能。

的一种方式是使用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)它适用于整个矢量),你必须设置UniformOutputfalsecellfun,那么向量合并成一个矩阵,沿着正确的维度总结他们,并应用公式来获得矢量结果。

+0

在你的情况下,你也可以让'makeFunc'接受函数句柄并编写嵌套函数来评估每个函数并返回它们的总和。 – Amro 2012-07-24 20:15:10

+0

不幸的是,你的'makeFunc'不会生成任意数量的函数来加在一起。虽然我想这不会是一个艰难的解决方案。 – 2012-07-24 20:29:54

+0

@NickM:看看我更新的例子,你可以传递存储在单元格数组中的任意数量的函数句柄,并且它将创建一个新函数作为所有应用的总和 – Amro 2012-07-24 20:42:22

0

如果你的目标是创建一个功能手柄,总结任意数量的函数的输出,你可以做到以下几点:

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) 
+0

在你的'funStr'一行中,你将单元格元素聚拢在一起,我遇到了一个问题,数组元素不会被写成字符串,并且完全忽略该部分。例如。我得到'@(x,y)',但不是'@(x,y)(单元格元素)' – 2012-07-24 21:17:55

+0

@NickM:当我运行我的例子时,它工作得很好。您的问题与您的问题或您的职能有关吗?如果是后者:确保'sprintf'语句正确地返回加数的字符串表示形式(参数填充正确 - 您可能需要使用%f作为格式字符串!) – Jonas 2012-07-24 21:32:15