詳細なMATLAB無名関数(超包括的)

この記事では、主にMATLAB無名関数の基本的でユニークな使用法について説明します。

1無名関数の生成

1.1基本世代

(例)

f = @(x)x ^ 2;

注:無名関数の入力パラメーターはベクトルの形式にすることができ、一部の操作をポイント操作に変更するだけで済みます。

f = @(x)x。^ 2;
f(1:5)

年=

  1     4     9    16    25

このように書くこともできますが、3.3に示す場合を除いて推奨されません。

f = @(x)arrayfun(@(x)x ^ 2、x)
f(1:5)

同時に、次のように、論理演算は無名関数にも当てはまります。

f = @(x)x> 3&x <5

区分的関数:

f = @(x)(x> 3)* 5 +(x <= 3)* 4

1.2マルチパラメータ無名関数

(例)

f = @(x、y)x ^ 2 + y;

1.3固定パラメータを持つ無名関数

詳細はセクション2.4
(例)を参照してください

a = 5;
f = @(x)a * x ^ 2;

aの値が後で変更されても、関数fのaは変更されないことに注意してください。次に例を示します。

a = 5;
f = @(x)a * x ^ 2;
a = 1;
f(2)

ans = 20、
この時点で無名関数が保存されている場合、ここで取得される値は4ではなく20であることに注意してください。次に例を示します。

a = 5;
f = @(x)a * x ^ 2;
func1.matfを保存します。

この時点で保存されている無名関数にはまだパラメーターが含まれており、次の2つの方法で使用できます。

load( 'func1.mat')
f(2)


func = load( 'func1.mat');
func.f(2)

1.4匿名関数の記号

sym形式の数式は、次のように無名関数を生成できます(最初の数式は低速です)

syms x
a = x ^ 2 + x;
f = matlabFunction(a)

または

a = sym(x ^ 2 + x);
f = matlabFunction(a)

1.5文字列から無名関数へ

方法は次のとおりです。

a = '@(x)x ^ 2 + 2 * x';
b = str2sym(a);
f = matlabFunction(b)

注:MATHWORKは最近
strとhandleのの変換関数をリリースしました。新しいバージョンでは、次の方法を使用できます。

str = '@(x)7 * x-13';
fh = str2func(str)

1.6関数ファクトリ(無名関数の自動生成)
1.6.1既知のパラメータの数

いくつかのプロジェクトでは、異なる匿名関数は、異なるパラメータに従って生成される必要がある。
例えば、以下は、Bの三つのパラメータを自動的異なる匿名関数を生成することができる生成関数であり、cが異なっている:
方法1(とsymの助けを借りて):

 function func=funcFactory(a,b,c)
	syms x
	func=matlabFunction(a*x^2+b*x+c);
end

方法2(文字列の助けを借りて):

function func=funcFactory(a,b,c)
	str=['@(x)',num2str(a),'*x^2+',num2str(b),'*x+',num2str(c )];
	func=matlabFunction(str2sym(str));
end

使い方:

funcFactory(1,2,3)

年=

次の値を含むfunction_handle:

@(x)x.*2.0+x.^2+3.0
1.6.2不明なパラメータの数

不明なパラメーターの数は、
x1、x2、x3 ... xnまたは
v1、v2、v3 ... vnの形式に設定できます

以下は、それを生成するための可変長の関数です。ここで、vは可変長のパラメーターです。

function func=funcFactory(v)
f=0;
for i=1:length(v)
    xn=str2sym(['x',num2str(i)]);
    f=f+v(i)*xn;
end
func=matlabFunction(f);
end

使い方:

funcFactory([1 2 3 4 3])

年=

次の値を含むfunction_handle:

@(x1,x2,x3,x4,x5)x1+x2.*2.0+x3.*3.0+x4.*4.0+x5.*3.0
1.7フィッティング結果を無名関数に変換する

(例)

x = [2 2.5 3 3.5 4 4.5 5 5.5 6];
y = [41 38 34 32 29 28 25 22 20];
p = polyfit(x、y、3);
f = matlabFunction(poly2sym(p))

f =

次の値を含むfunction_handle:

@(x)x.*(-8.57e+2./5.4e+1)+x.^2.*(2.56e+2./9.9e+1)-x.^3.*(5.8e+1./2.97e+2)+7.05e+2./1.1e+1
1.8無名関数の参照

以下に示すように、f2はf1の逆関数です。

f1 = @(x)x ^ 2;
f2 = @(x)1 / f1(x)
f2(2)は
、固定パラメーターを持つ以前の無名関数に似ています。ここでは、f1は、たとえ固定パラメーターであっても、固定パラメーターと見なすことができます。後で変更されますf2に影響します

1.9パラメータのない無名関数

(例)

e = @()exp(1);
e()
t = @()datestr(now);
t()

年=

2.7183

年=

'04-Mar-2021 20:18:30'
1.10再帰的無名関数

例として階乗関数を取り上げます。

factorial=@(n) (n>1)*n*factorial(n-1)+(n==1)
1.11名前付き関数から無名関数への変換

実際、この名前は厳密ではありません。名前付き関数への関数ハンドルのコピーと呼ばれる必要があります。

fsum = @ mysum
fsum(1,2)
関数c = mysum(a、b)
c = a + b;
終わり

fsum =

次の値を含むfunction_handle:

@mysum

年=

 3

2無名関数の構造

2.1無名関数配列
f={
    
    @(x)x^2;@(x)3*x;@(x)x^x}
f{
    
    1}(2)

f =

3×1セルアレイ

{@(x)x^2}
{@(x)3*x}
{@(x)x^x}

年=

 4
2.2無名関数の構造

func.f1 = @(x)x ^ 2;
func.f2 = @(x)3 * x;
func.f3 = @(x)x ^ x

メソッドの呼び出し:

func.f1(2)
func。( 'f1')(2)

func =

次のフィールドを持つ構造体:

f1: @(x)x^2
f2: @(x)3*x
f3: @(x)x^x

年=

 4
2.3無名関数の非スカラー構造配列

func(1).f = @(x)x ^ 2;
func(2).f = @(x)3 * x;
func(3).f = @(x)x ^ x;

func(1).f(2)
ans =

 6
2.4機能

関数関数は、1.3の例のように、無名関数情報を取得できます。

a=5;
f=@(x)a*x^2;

coe=functions(f)
coe.workspace{
    
    1}

coe =

次のフィールドを持つ構造体:

        function: '@(x)a*x^2'
            type: 'anonymous'
            file: 'E:\bin\匿名函数\Untitled.m'
       workspace: {[1×1 struct]}
within_file_path: ''

年=

次のフィールドを持つ構造体:

a: 5

関数情報にaが格納されていることがわかります
。1.8の例でも次のようになります。

f1 = @(x)x ^ 2;
f2 = @(x)1 / f1(x);
coe = Functions(f2)
coe.workspace {1}

coe =

次のフィールドを持つ構造体:

        function: '@(x)1/f1(x)'
            type: 'anonymous'
            file: 'E:\bin\匿名函数\Untitled2.m'
       workspace: {[1×1 struct]}
within_file_path: ''

年=

次のフィールドを持つ構造体:

f1: @(x)x^2
2.5ローカルで名前が付けられた関数の無名関数のリスト

localfunctions関数は、mファイルのすべての関数作成関数を取得し、無名関数リストを作成できます。

fh=localfunctions

function y=f1(x)
y=sqrt(x)+x^2;
end

function y=f2(x)
y=sqrt(x)+cos(x);
end

function y=f3(x)
y=sqrt(x)+sin(x);
end

fh =

3×1セルアレイ

{@f1}
{@f2}
{@f3}

3無名関数の使用

3.1無名関数をパラメーターとして使用する

f1 = @(x、y)max(x);
opt(f1,1,2)
関数c = opt(f、a、b)
c = f(a、b);
終わり

以下の記述方法は無名関数には適用されず、関数によって作成された関数にのみ適用されることに注意してください。

f1 = @(x、y)max(x);
opt( 'f1'、1,2)
関数c = opt(f、a、b)
c = f(a、b);
終わり

3.2他のファイルの匿名関数を呼び出す

ここに画像の説明を挿入します
ここに画像の説明を挿入します

3.3無名関数を使用して陰関数を表す

この記事を参照してください:MATLAB無名関数2のアプリケーション
たとえば、暗黙の関数があります:
(ey + xy)1 y − x 2 y = 0(e ^ y + x ^ y)^ {\ frac {1} { y}}-x ^ 2y = 0eY+バツおよびY1バツ2 Y=0
は無名関数として表すことができます。

y=@(x)fzero(@(y)(exp(y)+x^y)^(1/y)-x^2*y,1);

y(1)
年=

2.7779

この記述方法では、一度に入力できるのは変数のセットのみです。ベクトル演算を実行するには、arrayfunを使用して支援し、次の形式を記述する必要があります。

Y=@(x)arrayfun(@(xx)fzero(@(y)(exp(y)+xx^y)^(1/y)-xx^2*y,1),x);

Y(1:5)
年=

2.7779    1.1055    0.7759    0.6284    0.5425
3.4無名関数の描画

たとえば、いくつかの奇妙な使用法もあります。お絵かき

x = -2:0.1:2; y = -2:0.1:2;
f = @(x、y)plot(x、y。^ 2);
f(x、y)

ここに画像の説明を挿入します
複数の描画コマンドは角かっこで囲まれ、セミコロンで区切られています。

x=-2:0.1:2;y=-2:0.1:2;
f=@(x,y)[plot(x,y.^2,'-o','LineWidth',1.8);title('x^2','FontSize',14);xlabel('x','FontSize',13)];
f(x,y)

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/slandarer/article/details/114375636