.^
MATLABで指数関数を再定義するにはどうすればよいですか?から:
x.^y
に:
sign(x).*abs(x.^y))
.^
MATLABで指数関数を再定義するにはどうすればよいですか?から:
x.^y
に:
sign(x).*abs(x.^y))
MATLAB で算術演算子を再定義できますか?... はい
MATLAB で算術演算子を再定義する必要がありますか? ...ええ、おそらくそうではありません。
なんで?MATLAB の他のすべての関数は、算術演算子が組み込み実装で定義されたとおりに動作することを想定しているためです。
算術演算子のオーバーロードと組み込み動作のシャドーイングを扱った他のいくつかの関連する質問に答えました。最初にこれらを読んで、そのようなアプローチに関連する詳細、困難、および落とし穴を理解することをお勧めします。
免責事項の説明が終わったので、自分の足を撃つ可能性のある銃をお渡しします... ;)
MATLAB の算術演算子には、呼び出し時にバックグラウンドで呼び出される同等の機能があります。これらをここにリストします。配列ごとのべき乗演算子は、呼び出されたとき.^
に組み込みpower
関数を呼び出します。
これで、それを使用するデータ型power
ごとに個別の関数が定義されます。この関数はディレクトリに配置されます。関数を使用して、存在するさまざまな関数を調べることで確認できます。@type
which
power
>> which power -all
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@single\power) % single method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@double\power) % double method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@char\power) % char method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@int64\power) % int64 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@int32\power) % int32 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@int16\power) % int16 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@int8\power) % int8 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@uint64\power) % uint64 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@uint32\power) % uint32 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@uint16\power) % uint16 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@uint8\power) % uint8 method
変数x
とy
が (MATLAB の既定の設定のように) 型になる場合は、組み込み関数double
をシャドウする必要があります。@double\power
これを行うには、ディレクトリ ( と呼びますtemp
) を作成し、その中にサブディレクトリを作成し、そのサブディレクトリ@double
に次のカスタムpower
関数を配置します。
function result = power(x, y)
result = sign(x).*abs(builtin('power', x, y));
end
ここで、MATLAB が従う関数の優先順位に基づいて、ディレクトリtemp
をMATLAB パスに追加するか、単に現在の作業ディレクトリをtemp
に変更するpower
と、.^
double 変数の演算子。
しないでください。それは正しくありません。(-1).^(1/2) は常に虚数単位 (i) を与えるはずです。あなたが持っている式はあなたに与えるでしょう (-1).^(1/2) -> -1. さらに悪いことに、(-1)^2 を考えてみましょう。
説明している操作を実行する別の関数を作成します。何かのようなもの
function a = myPowerFunc(x, y)
a = sign(x).*abs(x.^y);