この記事では、主に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 = 0(eY+バツおよび)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)