3

.^MATLABで指数関数を再定義するにはどうすればよいですか?から:

x.^y

に:

sign(x).*abs(x.^y))
4

2 に答える 2

12

MATLAB で算術演算子を再定義できますか?... はい

MATLAB で算術演算子を再定義する必要がありますか? ...ええ、おそらくそうではありません。

なんで?MATLAB の他のすべての関数は、算術演算子が組み込み実装で​​定義されたとおりに動作することを想定しているためです。

算術演算子のオーバーロードと組み込み動作のシャドーイングを扱った他のいくつかの関連する質問に答えました。最初にこれらを読んで、そのようなアプローチに関連する詳細、困難、および落とし穴を理解することをお勧めします。

免責事項の説明が終わったので、自分の足を撃つ可能性のある銃をお渡しします... ;)


MATLAB の算術演算子には、呼び出し時にバックグラウンドで呼び出される同等の機能があります。これらをここにリストします。配列ごとのべき乗演算子は、呼び出されたとき.^に組み込みpower関数を呼び出します。

これで、それを使用するデータ型powerごとに個別の関数が定義されます。この関数はディレクトリに配置されます。関数を使用して、存在するさまざまな関数を調べることで確認できます。@typewhichpower

>> 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

変数xyが (MATLAB の既定の設定のように) 型になる場合は、組み込み関数doubleをシャドウする必要があります。@double\powerこれを行うには、ディレクトリ ( と呼びますtemp) を作成し、その中にサブディレクトリを作成し、そのサブディレクトリ@doubleに次のカスタムpower関数を配置します。

function result = power(x, y)
  result = sign(x).*abs(builtin('power', x, y));
end

ここで、MATLAB が従う関数の優先順位に基づいて、ディレクトリtempMATLAB パスに追加するか、単に現在の作業ディレクトリtempに変更するpowerと、.^double 変数の演算子。

于 2011-09-28T04:45:09.057 に答える
8

しないでください。それは正しくありません。(-1).^(1/2) は常に虚数単位 (i) を与えるはずです。あなたが持っている式はあなたに与えるでしょう (-1).^(1/2) -> -1. さらに悪いことに、(-1)^2 を考えてみましょう。

説明している操作を実行する別の関数を作成します。何かのようなもの

function a = myPowerFunc(x, y)

a = sign(x).*abs(x.^y);
于 2011-09-28T03:03:11.490 に答える