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