ppmak
pp 型のスプラインの組み立て
構文
ppmak(breaks,coefs)
ppmak
ppmak(breaks,coefs,d)
ppmak(breaks,coefs,sizec)
説明
コマンド ppmak(...) は、最小限の情報と、その情報から推論されるその他のことから、pp 型のスプラインを組み立てます。fnbrk は完全な説明のすべてまたはいずれかの部分を提供します。このようにして、pp 型の格納に使用される実際のデータ構造体は、この構成要素を使用するさまざまな fn... コマンドに影響を及ぼすことなく容易に変更されます。ただし、一時的なユーザーが明示的に ppmak を使用することはほとんどなく、代わりに、ツールボックス内のさまざまなスプライン作成コマンドを利用して特定のスプラインを作成しています。
ppmak(breaks,coefs) は、breaks のブレーク情報と coefs の係数情報によって指定されたスプラインの pp 型を返します。その情報がどのように解釈されるかは、シーケンスまたは cell 配列である breaks によって示されるように、関数が一変量か多変量かによって異なります。
breaks がシーケンスの場合は、非減少で、最初のエントリが最後のエントリとは異なっていなければなりません。その後、関数が一変量であると仮定され、pp 型のさまざまな部分が次のように決定されます。
多項式区分の数
lはlength(breaks)-1として計算され、基本区間はそれに応じて、区間[breaks(1)..breaks(l+1)]となります。関数のターゲットの次元
dは、coefsの行数となります。つまり、coefsの各列が 1 つの係数として使用されます。より明確に言うと、coefs(:,i*k+j)は、(i+1)番目の多項式区分のj番目の係数を含むと仮定されます (最初の係数が最大で、k番目の最小または定数の係数)。そのため、coefsの列数klを使用して、区分的多項式の次数kはfix(kl/l)として計算されます。
その後、coefs のエントリはコマンドによって並べ替えられます。
coefs = reshape(permute(reshape(coefs,[d,k,l]),[1 3 2]),[d*l,k])
これは、一変量スプラインに対する pp 型の係数配列の内部解釈と一致させるためです。これは、breaks がシーケンス (行ベクトル) である構文 ppmak(breaks,coefs) を使用する場合にのみ適用され、cell 配列である場合は適用されません。ppmak の 3 引数形式を使用する場合は、並べ替えは行われません。3 引数形式の場合は、並べ替えではなく、再形成のみが実行されます。
breaks が cell 配列で、長さ m の場合、関数は m 変量 (テンソル積) であると仮定され、pp 型のさまざまな部分は次のように入力から決定されます。
mベクトル I のi番目のエントリがlength(breaks{i})-1となり、それに応じて、その基本区間のmcell 配列のi番目のエントリが区間[breaks{i}(1) .. breaks{i}(end)]となります。関数のターゲットの次元
dと、その区分の (座標単位の多項式の) 次数のmベクトルkは、次のようにcoefsのサイズから直接取得されます。coefsがm次元の配列の場合、関数はスカラー値を使用するため、dは 1 で、mベクトルkはsize(coefs)./lとして計算されます。その後、coefsはコマンドcoefs = reshape(coefs,[1,size(coefs)])によって再形成されます。coefsが (r+m) 次元の配列で、sizec = size(c)の場合、dはsizec(1:r)に設定されvectorkはsizec(r+(1:m))./lとして計算されます。その後、coefsはコマンドcoefs = reshape(coefs,[prod(d),sizec(r+(1:m))])によって再形成されます。
その後、coefs はサイズ [d,l(1),k(1),l(2),k(2),...,l(m),k(m)] の等価な配列として解釈され、その (:,i(1),r(1),i(2),r(2),...,i(m),r(m)) 番目のエントリは、次の係数となります。
これは、次の辺をもつ (ハイパー) 四角形における関数の局所的多項式表現です。
実際に、これが多変量スプラインの pp 型における係数配列の内部解釈です。
ppmak によって、breaks と coefs を指定するように求められます。
d が正の整数の ppmak(breaks,coefs,d) も、提供された情報からスプラインの pp 型を組み立てますが、関数は一変量であると想定します。その場合、coefs はサイズ [d*l,k] となり、l は length(breaks)-1 として取得され、これによってスプラインの次数 k が決まります。これに基づき、coefs(i*d+j,:) は (i+1) 番目の多項式区分に対する係数ベクトルの j 番目のコンポーネントとなります。
sizec が正の整数の行ベクトルである ppmak(breaks,coefs,sizec) も、提供された情報からスプラインの pp 型を組み立てますが、coefs のサイズが sizec であると解釈します (prod(size(coefs)) が prod(sizec) と異なる場合はエラーを返します)。これは、入力引数 coefs が、末尾にある大きさが 1 の次元を 1 つ以上もつ配列であるまれな場合にのみ重要なオプションとなります。これは、MATLAB® では、末尾にある大きさが 1 の次元が抑制されるため、coefs の目的のサイズをこのように明示的に指定していない場合は、coefs が ppmak によって正しく解釈されないためです。
例
2 つのスプライン
p1 = ppmak([1 3 4],[1 2 5 6;3 4 7 8]); p2 = ppmak([1 3 4],[1 2;3 4;5 6;7 8],2);
は、正確に同一の pp 型 (2 ベクトル値、次数 2) をもちます。ただし、2 番目のコマンドは内部で使用される配置に係数を提供します。
ppmak([0:2],[1:6]) は、基本区間が [0..2] で、次数 3 の 2 つの区分で構成され、唯一の内部ブレーク 1 をもつ区分的多項式関数を作成します。得られる関数はスカラーです。つまり、ターゲットの次元 d は 1 です。1 番目の区分が x|→x2 + 2x + 3 であり、一方、2 番目の区分は x|→4(x – 1)2 + 5(x–1) + 6 であるため、関数はそのブレークで連続した状態になります。
関数が一変量で次元 d が明示的に指定されていない場合、次元は coefs の行数になります。列数は、breaks によって指定された区分の数 l の整数倍になります。たとえば、ステートメント ppmak([0:2],[1:3;4:6]) はエラーとなります。これは、ブレーク シーケンス [0:2] は 2 つの多項式区分を示しており、係数行列では偶数の列が想定されるためです。変更されたステートメント ppmak([0:1],[1:3;4:6]) は放物曲線 x|→(1,4)x2 + (2,5)x + (3,6) を指定します。特に、ターゲットの次元 d は 2 です。別の方法で変更したステートメント ppmak([0:2],[1:4;5:8]) も平面曲線を指定します (つまり、d が 2) が、これは区分的線形です。1 番目の多項式区分は、x|→(1,5)x + (2,6) です。
次元 d を明示的に指定すると、一変量の場合、coefs のエントリが異なって解釈されます。列数がその区分の多項式の次数を示し、行数が区分数の d 倍に等しくなります。そのため、ステートメント ppmak([0:2],[1:4;5:8],2) はエラーとなりますが、ステートメント ppmak([0:2],[1:4;5:8],1) は、1 番目の区分が x|→x3 + 2x2 + 3x + 4 であるスカラーの区分的 3 次を指定します。
基本区間が [0..1] で、その値が行列 eye(2) の定数多項式を作成する場合は、完全にオプションの 3 番目の引数を使用します。つまり、次のコマンドを使用します。
pp = ppmak(0:1,eye(2),[2,2,1,1]);
最後に、四角形 [–1 .. 1] x [0 .. 1] で、1 番目の変数が線形で、2 番目が定数の 2 ベクトル値二変量多項式を作成する場合は、次のようになります。
coefs = zeros(2,2,1); coefs(:,:,1) = [1 0; 0 1];
この場合、次の単純なコマンド
pp = ppmak({[-1 1],[0 1]},coefs);
は失敗し、次のように、各変数で次数 2 のスカラー値関数が生成されます。
pp = ppmak({[-1 1],[0 1]},coefs,size(coefs));
一方、次のコマンドは正常に実行されます。
pp = ppmak({[-1 1],[0 1]},coefs,[2 2 1]);
その他の例については、例 "Intro to ppform" を参照してください。