このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
クラスによる多项の表现
オブジェクトの要件
この例は、多項式を表すクラスを MATLAB®言語で実装します。設計要件は以下のとおりです。
値クラスの動作 - 多項式オブジェクトは、コピーして関数に渡すときに MATLAB 数値変数のように動作します。
表示とインデックス特化
オブジェクトはスカラーのみです。表示とインデックス機能の特化により通常の配列動作は妨げられます。
算术演算
Matlab关数关数关数关数と多项オブジェクトとのをを简略简略简略化するするするするするするするするするするするするする
DocPolynom
クラスメンバー
クラスの,を保存するためプロパティを指定,クラスのの定义定义を(@DocPolynom
)を定義します。
次の表は、DocPolynom
クラスに対してさプロパティをてあります。
DocPolynom
クラスプロパティ
名前 |
クラス |
既定 |
说明 |
---|---|---|---|
|
|
|
多项式[最高...最...最次数] |
次の表は、DocPolynom
クラスのメソッドをまとめてあります。
DocPolynom
クラスメソッド
名前 |
说明 |
---|---|
|
クラスコンストラクター |
|
|
|
|
|
MATLAB が |
|
独立変数値として指定できますまた,ドット表记で |
|
|
|
|
|
|
DocPolynom
クラスの使用
次の例,DocPolynom
クラスの的使用方法を示し。。
次の多項式を表すDocPolynom
オブジェクトをしコンストラクター关数の引数は,多项式系数および
が含まれ。
p1 = docpolynom([[1 0 -2 -5])
p1 = x^3-2*x -5
p2= DocPolynom([2 0 3 2 -7])
p2 = 2*x^4 + 3*x^2 + 2*x -7
系数を关数根
に渡す,多项の根をし。。。
根((p1。coef)
ans = 2.0946 + 0.0000i -1.0473 + 1.1359i -1.0473 - 1.1359i
2つの式p1
とp2
を加算します。
MATLAB は、2 つのDocPolynom
オブジェクトを加算とき,DocPolynom
クラスに対して定义れた加
メソッドを呼び出します。
p1+p2
ans = 2*x^4 + x^3 + 3*x^2 - 12
DocPolynom
クラスの概要
コード例 | 说明 |
---|---|
classdefDocPolynom
|
多項式のデータ型を実装する値クラス。 |
propertiescoef结尾 |
多项式[最高...最...最次数] |
methods
|
メソッドについて一般情报は,通常のメソッドを参照してください。 |
功能obj = docpolynom(c)如果nargin > 0如果伊萨((c,'DocPolynom')obj。coef = c.coef;别的obj。系数= c(:)。';结尾结尾结尾 |
クラスコンストラクターが以下を使用してオブジェクトを作成します。
docpolynomコンストラクターを参照してください。 |
功能obj = set.coef(obj,val)如果~isa(val,'双倍的') 错误('Coefficients must be doubles')结尾ind = find(val(:)。'〜= 0);如果~isempty(ind); obj.coef = val(ind(1):end);别的obj.coef = val;结尾结尾 |
不要な系数削除を参照してください。 |
功能c = double(obj) c = obj.coef;结尾 |
系数を返して 他のタイプへの DocPolynom オブジェクトの変換を参照してください。 |
功能str = char(obj)如果all(obj.coef == 0) s ='0'; str = s;返回别的d = length(obj.coef)-1; s = cell(1,d); ind = 1;为了a = obj.coef;如果a〜 = 0;如果ind〜 = 1如果a> 0 s(ind)= {' + '};ind = ind + 1;别的s(ind) = {' - '};a = -a; ind = ind + 1;结尾结尾如果A〜 = 1 ||d == 0如果a == -1 s(ind)= {' - '};ind = ind + 1;别的s(ind) = {num2str(a)}; ind = ind + 1;如果d > 0 s(ind) = {'*'};ind = ind + 1;结尾结尾结尾如果d >= 2 s(ind) = {['x^'int2str(d)]}; ind = ind + 1;别的如果d == 1 s(ind)= {'X'};ind = ind + 1;结尾结尾d = d -1;结尾结尾str = [s {:}];结尾 |
y = f(x) 他のタイプへの DocPolynom オブジェクトの変換を参照してください。 |
功能disp((obj) c = char(obj);如果iscell(c)disp([' 'C{:}])别的disp((c)结尾结尾 |
关数 このコードについての詳細は、docpolynomのdispのオーバーロードを参照してください。 |
功能dispPoly (obj, x)p = char(obj);e = @(x)est(p);y =零(长度(x));disp([['y =',p])为了k = 1:长度(x)y(k)= e(x(k));disp([[' ',num2str(y(k)),。。。' = f(x = ',,,,。。。num2str(x(k)),')'])结尾结尾 |
評価した式をフォーマットされた出力で返します。
このコードについての詳細は、评価さた式の表示を参照してください。 |
功能b = subsref(a,s)switchs(1).typecase'()'ind = s.subs{:}; b = polyval(a.coef,ind);case'。'switchs(1).subscase'coef'b = a.coef;case'disp'disp((a)otherwise如果长度(s)> 1 b = a。(s(1).subs)(s(2).subs {:});别的b = a.(s.subs);结尾结尾otherwiseerror('Specify value for x as obj(x)')结尾结尾 |
このコードについての詳細は、インデックス付き参照再定义を参照してください。 |
功能r = plus(obj1,obj2)obj1 = docpolynom(obj1);obj2 = docpolynom(obj2);k =长度(obj2.coef) - 长度(obj1.coef);zp =零(1,k);zm =零(1,-K);r = docpolynom([ZP,obj1.coef] + [zm,obj2.coef]);结尾功能r =减(OBJ1,OBJ2)obj1 = docpolynom(obj1);obj2 = docpolynom(obj2);k =长度(obj2.coef) - 长度(obj1.coef);zp =零(1,k);zm =零(1,-K);r = DocPolynom([zp,obj1.coef] - [zm,obj2.coef]);结尾功能r = mtimes(obj1,obj2) obj1 = DocPolynom(obj1); obj2 = DocPolynom(obj2); r = DocPolynom(conv(obj1.coef,obj2.coef));结尾结尾 |
3つ算术を定义ます。。
このコードの詳細については、算术演算子の定義を参照してください。 演算子の定義についての一般情報は、演算子のオーバーロードを参照してください。 |
结尾结尾 |
|
DocPolynom
コンストラクター
次の関数は,ファイル@docpolynom/docpolynom.m
にある、DocPolynom
クラスのコンストラクター。
methods功能obj = docpolynom(c)如果伊萨((c,'DocPolynom')obj。coef = c.coef;别的obj。系数= c(:)。';结尾结尾结尾
コンストラクターの呼び出しの構文
2 つの異なる引数でDocPolynom
コンストラクターを呼び出すます。
DocPolynom
のコンストラクターする例,以下ののにになります。
p= DocPolynom([1 0 -2 -5]) p = x^3 - 2*x -5
このステートメントは,DocPolynom
クラスのインスタンスを指定した係数で作成します。オブジェクトの表示が、MATLAB 言語構文を使用する等価な多項式を表していることに注意してください。DocPolynom
クラスは,disp
とchar
クラスのメソッドを使用してこの表示を行います。
不要な系数削除
matlabにおける式,降顺のを含む行ベクトルれますます。。系数系数ベクトルのゼロはは,多多项からから除く除く项表し表ししたがっしたがっしたがっしたがっしたがっしたがってて,,。
DocPolynom
クラスのメソッドには、多項式の次数を決めるために係数ベクトルの長さを使うものがあります。したがって、係数ベクトルが真の値を表すように、係数ベクトルから先頭のゼロを削除することが有効です。
DocPolynom
クラスは,指定した係数から先頭のゼロを削除するために set メソッドを使用するプロパティにおいて、プロパティ値を設定する前に、係数ベクトルを格納します。
methods功能obj = set.coef(obj,val)如果~isa(val,'双倍的') 错误('Coefficients must be doubles')结尾ind = find(val(:)。'〜= 0);如果~isempty(ind); obj.coef = val(ind(1):end);别的obj.coef = val;结尾结尾结尾
他のタイプへのDocPolynom
オブジェクトの変換
DocPolynom
クラスクラスはつのつのを定义して,DocPolynom
オブジェクトをのクラス変换します。
double
-关数を使って係数に数学演算を実行できるように、double の数値型に変換します。char
- コマンドウィンドウする,出力书式设定使用するに変换します。
double コンバーター
DocPolynom
クラスのdouble コンバーター メソッドは、係数ベクトルを返します。
methods功能c = double(obj) c = obj.coef;结尾结尾
DocPolynom
オブジェクトp
の場合、
p= DocPolynom([1 0 -2 -5]);
ステートメント、
c = double(p)
は,以下を返します。
c= 1 0 -2 -5
これは、double
クラスになります。
class(c) ans = double
文字コンバーター
char
メソッドは,X
のべきとしてされる多项式表す表すchar
ベクトルを生成します。返されるchar
ベクトルは構文的に正しい MATLAB 式です。
char
cell配列配列使用し,表示れた多项式をするするするするchar
ベクトルの要素をまとめます。
disp
メソッドは,するDocPolynom
オブジェクトを書式化するためにchar
メソッドを使用します。evalPoly
メソッドはchar
を使用して、評価する MATLAB 式を作成します。
DocPolynom
オブジェクトのユーザーがchar
またはdisp
メソッドを直接呼び出す可能性は高くありませんが、これらのメソッドにより、DocPolynom
Matlabのののデータとと动作できるようなりなり。。
以下は、char
メソッドです。
methods功能str = char(obj)如果all(obj.coef == 0) s ='0'; str = s;返回别的d = length(obj.coef)-1; s = cell(1,d); ind = 1;为了a = obj.coef;如果a〜 = 0;如果ind〜 = 1如果a> 0 s(ind)= {' + '};ind = ind + 1;别的s(ind) = {' - '};a = -a; ind = ind + 1;结尾结尾如果A〜 = 1 ||d == 0如果a == -1 s(ind)= {' - '};ind = ind + 1;别的s(ind) = {num2str(a)}; ind = ind + 1;如果d > 0 s(ind) = {'*'};ind = ind + 1;结尾结尾结尾如果d >= 2 s(ind) = {['x^'int2str(d)]}; ind = ind + 1;别的如果d == 1 s(ind)= {'X'};ind = ind + 1;结尾结尾d = d -1;结尾结尾str = [s {:}];结尾结尾
docpolynomのdisp
のオーバーロード
DocPolynom
オブジェクトのより有効な表示を与えるには、このクラスは、クラス定義においてdisp
をオーバーロードします。
このdisp
メソッドは,char
メソッドによって、多項式のテキスト表現を画面上に表示します。
係数がすべて 0 の場合、char
メソッドはcell 配列または文字'0'
を返します。
methods功能disp((obj) c = char(obj);如果iscell(c)disp([' 'C{:}])别的disp((c)结尾结尾结尾
MATLABがdisp
メソッドを呼び出す場合
次のステートメント
p= DocPolynom([1 0 -2 -5])
は,DocPolynom
オブジェクトをますステートメントのにコロンない,出力出力结果はコマンドラインラインに次次のようにに表示表示
p = x^3-2*x -5
评価さた式の表示
char
コンバーターメソッドは,DocPolynom
オブジェクトによって表される多項式の MATLAB 式を形成します。脱离
メソッドはchar
メソッドによってれるを,指定さたたX
の値评価します。
methods功能dispPoly (obj, x)p = char(obj);e = @(x)est(p);y =零(长度(x));disp([['y =',p])为了k = 1:长度(x)y(k)= e(x(k));disp([[' ',num2str(y(k)),。。。' = f(x = ',,,,。。。num2str(x(k)),')'])结尾结尾结尾
DocPolynom
オブジェクトp
を作成し。
p= DocPolynom([1 0 -2 -5])
p = x^3-2*x -5
X
が3 つの値[3 5 9]
と等しいときの多項式を評価します。
脱离((p,,,,[3 5 9])
y = x^3-2*x -5 16 = f(x = 3)110 = f(x = 5)706 = f(x = 9)
インデックス付き参照再定义
DocPolynom
クラスは式表すオブジェクト使用サポートするため,インデックス付き参照参照を再再定义しDocPolynom
クラスでオブジェクトの添字によって添字と独立変数の値による多项式式の评価评価れれれ
たとえば、次の多項式を与えると、
DocPolynom
オブジェクトp
を作成し。
p= DocPolynom([1 0 -2 -5])
p = x^3-2*x -5
次の付きの式,,X= 3
とX= 4
で多項式の値を評価し、結果の値を返します。
p(([3 4])
ans = 16 51
インデックス付き参照の設計目標
子ref
メソッドをて既定の添字参照を再定义し。。
クラスで子ref
メソッドをする添字付きの参照あるときは必ず必ず,,,,はははこのクラスのオブジェクトに対してに対してこのメソッドを子ref
メソッドは特定のケース,のインデックス付きの动作をを定义ししなければばなり。
DocPolynom
の子ref
メソッドは以下动作を実装し。。
p(x = [a1。。。an])
-X= a
で多項式を評価します。P.Coef
-coef
プロパティの値にアクセスします。p.disp
- 出力をに多项式をを式式としてします。obj = p.method((args)
-ドット表記を使用して引数と共にメソッドを呼び出し、変更されたオブジェクトを返します。obj = p.method
-ドット表記を使用して引数なしでメソッドを呼び出し、変更されたオブジェクトを返します。
子ref
実装の详细
子ref
メソッドは关数子ref
をオーバーロードします。
たとえば、関数polyval
への呼び出しを考えます。
p= DocPolynom([1 0 -2 -5]) p = x^3 - 2*x - 5 polyval(p.coef,[3 5 7]) ans = 16 110 324
关数polyval
は以下を必要とします。
多项式系数
多項式の評価に使用する独立変数の値
关数polyval
はこうした値におけるf(x)
の値をます。子ref
はステートメントを通してpolyval
を呼び出します。
case'()'ind = s.subs{:}; b = polyval(a.coef,ind);
ドット表记使用引数を伴うメソッドをサポートするために子ref
を実装する,type
およびsubs
構造フィールドのどちらにも複数の要素が含まれます。
子ref
メソッドはのリストに示さてように,のの添字参照を明示明示的的ますますます
methods功能b = subsref(a,s)switchs(1).typecase'()'ind = s.subs{:}; b = polyval(a.coef,ind);case'。'switchs(1).subscase'coef'b = a.coef;case'disp'disp((a)otherwise如果长度(s)> 1 b = a。(s(1).subs)(s(2).subs {:});别的b = a.(s.subs);结尾结尾otherwiseerror('Specify value for x as obj(x)')结尾结尾结尾
算术演算子の定義
多项式はか算术演算がをもちます。DocPolynom
クラスはのメソッド実装します。
メソッドと构文 |
実装される演算子 |
---|---|
|
加算 |
|
减算 |
|
行列乗算 |
算术演算子をオーバーロードする場合は、サポートの必要があるデータ型を考慮します。加
,minus
およびmtimes
のメソッドは,DocPolynom
-DocPolynom
とDocPolynom
-double
というオペランド组み合わせ加算,减算,を扱うように,DocPolynom
クラスに対してされます。
+
演算子の定義
p
または问
がDocPolynom
オブジェクトである,次のについて考えます。
p + q
この式他方オブジェクトがより高いをもつのでなければ关数关数@docpolynom/plus
を呼び出します。
次のメソッドはDocPolynom
クラスの加
((+
)演算子をオーバーロードします。
methods功能r = plus(obj1,obj2)obj1 = docpolynom(obj1);obj2 = docpolynom(obj2);k =长度(obj2.coef) - 长度(obj1.coef);zp =零(1,k);zm =零(1,-K);r = docpolynom([ZP,obj1.coef] + [zm,obj2.coef]);结尾结尾
この关数机能について说明。。
両方の入力引数を
DocPolynom
オブジェクトにします。次のような式p+1
は,
DocPolynom
とdouble
の両方を含みますが、正しく動作します。2 つの係数ベクトルにアクセスし、必要な場合、一方にゼロを付加して両方を同じ長さにします。実際の加算は、2 つの係数ベクトルのベクトル和です。
DocPolynom
コンストラクターを呼び出して、適切な型のオブジェクトを多項式の加算結果として作成します。
-
演算子の定義
加
((+
)演算子と同じ方法で、minus
演算子 (-
)を実装します。
minus
メソッドはp
-问
を计算ます。优先ははDocPolynom
オブジェクトでなければなりません。
methods功能r =减(OBJ1,OBJ2)obj1 = docpolynom(obj1);obj2 = docpolynom(obj2);k =长度(obj2.coef) - 长度(obj1.coef);zp =零(1,k);zm =零(1,-K);r = DocPolynom([zp,obj1.coef] - [zm,obj2.coef]);结尾结尾
*
演算子の定義
mtimes
メソッドを実装て积p*问
を计算ます。つつの式の乘算,それらの系数ベクトルの(conv
)であるため、mtimes
メソッドは"行列" の乗算を実装します。
methods功能r = mtimes(obj1,obj2) obj1 = DocPolynom(obj1); obj2 = DocPolynom(obj2); r = DocPolynom(conv(obj1.coef,obj2.coef));结尾结尾
算术演算子の方法
DocPolynom
オブジェクトがられた场合,
p= DocPolynom([1 0 -2 -5]);
次の 2 つの算術演算は、DocPolynom
の加
とmtimes
メソッドを呼び出します。
问= p+1; r = p*q;
次のが出力さ。。
q = x^3-2*x -4 r = x^6-4*x^4-9*x^3 + 4*x^2 + 18*x + 20