1

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 が定義されていないため、最後の行から 4 番目の行は数値を生成しません。関数ハンドルの一部として保持する必要があるため、それらはできません。私のコードの簡素化されたバージョンについては、うまくいけば、これがポイントになります:

    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

2 に答える 2

3

あなたの質問は私にはあまり明確ではありませんが、何らかの入力によってパラメーター化された出力関数を生成する関数を作成しようとしていると思います。

1 つの方法は、クロージャー(親関数ワークスペースにアクセスする入れ子関数) を使用することです。例を挙げて説明しましょう:

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))。上記のジェネレーター関数を呼び出し、次のように 3 つの関数ハンドルを指定します。

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

注: 返される関数はスカラーで機能し、スカラー値を返します。ベクトル化する場合 (ベクトル全体に一度に適用できるようにするため)、 inf(1:100)に設定UniformOutputし、ベクトルを組み合わせて行列にし、正しい次元に沿って合計し、式を適用してベクトル結果。falsecellfun

于 2012-07-24T20:05:02.967 に答える
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)
于 2012-07-24T20:11:25.890 に答える