今回もすぐに使えるプロシージャを紹介していきます。
今回は、高速スプライン補間用のプロシージャを紹介します。
下の動画のように、補間位置個数が100~10000に増えてもほぼタイムラグなしに計算結果を出力します。
また、補間対象点数は200個になっております。
<高速化スプライン補間とは>
スプライン補間計算については過去記事で紹介しています。
http://blog.livedoor.jp/aero_iki-jibundakemacro/archives/30598662.html
http://blog.livedoor.jp/aero_iki-jibundakemacro/archives/30598662.html
http://blog.livedoor.jp/aero_iki-jibundakemacro/archives/30598867.html
過去記事で紹介していたスプライン補間計算は通常のスプライン補間です。
通常のスプライン補間計算では、補間対象の点数の数と同じ次元数の行列を計算する必要があるため、補間対象の点数の二乗に比例して計算数が増えてしまいVBAなどのプログラムではそのうち破綻してしまいます。
高速スプライン補間では、補間対象の点を少ない点数に分割して個別にスプライン補間することで飛躍的に計算速度向上を実現しています。
<高速化スプライン補間の手順>
「補間対象の点を少ない点数に分割して個別にスプライン補間」というのがちょっと分かりにくいので具体例で解説します。
まず補間点数が100個とします。
次に分割点数を5点とします。
1~6番目の補間対象点を元に通常のスプライン補間を実施し、補間後の点を1~5番目の間の補間対象点を結果で残します。
4~11番目の補間対象点を元に通常のスプライン補間を実施し、補間後の点を5~10番目の間の補間対象点を結果で残します。
9~16番目の補間対象点を元に通常のスプライン補間を実施し、補間後の点を10~15番目の間の補間対象点を結果で残します。
↓
↓
94~100番目の補間対象点を元に通常のスプライン補間を実施し、補間後の点を95~100番目の間の補間対象点を結果で残します。
最後に各分割範囲での補間後の点を順番に並べれば終了です。
具体例では分割点数を5点としましたが、スプライン補間で計算する行列の次元数は、両端で6、両端以外で7となります。
通常のスプライン補間計算だと行列の次元数は100となるのに比べて、より少ない計算数にすることが可能です。
もちろんデメリットとして、通常のスプライン補間に対して補間の精度が下がると思われますが、分割点数を5以上にすればほとんど結果に違いはありません。
<実行サンプル>
https://drive.google.com/drive/folders/1xp6_RzYYCeVkCNc3anCqmjnAowVhHGbJ?usp=sharing
<プロシージャ紹介>
プロシージャ名:SplineXYParaFast
種類:Functionプロシージャ
機能:パラメトリック関数形式でスプライン補間を高速で行う。
機能:
引数
ArrayXY2D・・・補間対象となるX,Yの値が格納された二次元配列。1列目がX,2列目がY。
BunkatuN・・・パラメトリック関数の分割個数。補間位置個数は(BunkatuN+1)となる。この値が大きいほどより細かい補間となる。
PointCount・・・高速化のための分割の一区画点数。値は5が目安。
返り値・・・補間後の点X,Yが入った二次元配列。1列目がX,2列目がY値。
<使い方>
実行サンプルの中身をそのまま持ってきています。
サンプルの中身は以下のようになっています。
「Test実行」「初期化」「VBE起動」の3つのボタンが設置してあります。

D7:E206セルにXY座標の値が入っていて、この点がスプライン補間の補間対象の点となります。点数は200点になります。
このXY座標は右側の散布図に青い点で描画されています。
K5セルに補間位置個数を入力します。
「Test実行」ボタンを押すと、D7:E206セルのXY座標のスプライン補間結果がG7:H7セル以下に出力されます。
G7:H7セル以下に出力された計算結果は右側のオレンジの点で散布図に描画されます。

K5セルに入力する補間位置個数を増やすほど、より細かい補間が可能となります。
下図では10000点で出力しています。

「VBE起動」ボタンを押すと、「Test実行」に登録してあるコードが表示されます。
このコード内でSplineXYParaFastプロシージャが使われています。

<コード>
今回は、高速スプライン補間用のプロシージャを紹介します。
下の動画のように、補間位置個数が100~10000に増えてもほぼタイムラグなしに計算結果を出力します。
また、補間対象点数は200個になっております。
<高速化スプライン補間とは>
スプライン補間計算については過去記事で紹介しています。
http://blog.livedoor.jp/aero_iki-jibundakemacro/archives/30598662.html
http://blog.livedoor.jp/aero_iki-jibundakemacro/archives/30598662.html
http://blog.livedoor.jp/aero_iki-jibundakemacro/archives/30598867.html
過去記事で紹介していたスプライン補間計算は通常のスプライン補間です。
通常のスプライン補間計算では、補間対象の点数の数と同じ次元数の行列を計算する必要があるため、補間対象の点数の二乗に比例して計算数が増えてしまいVBAなどのプログラムではそのうち破綻してしまいます。
高速スプライン補間では、補間対象の点を少ない点数に分割して個別にスプライン補間することで飛躍的に計算速度向上を実現しています。
<高速化スプライン補間の手順>
「補間対象の点を少ない点数に分割して個別にスプライン補間」というのがちょっと分かりにくいので具体例で解説します。
まず補間点数が100個とします。
次に分割点数を5点とします。
1~6番目の補間対象点を元に通常のスプライン補間を実施し、補間後の点を1~5番目の間の補間対象点を結果で残します。
4~11番目の補間対象点を元に通常のスプライン補間を実施し、補間後の点を5~10番目の間の補間対象点を結果で残します。
9~16番目の補間対象点を元に通常のスプライン補間を実施し、補間後の点を10~15番目の間の補間対象点を結果で残します。
↓
↓
94~100番目の補間対象点を元に通常のスプライン補間を実施し、補間後の点を95~100番目の間の補間対象点を結果で残します。
最後に各分割範囲での補間後の点を順番に並べれば終了です。
具体例では分割点数を5点としましたが、スプライン補間で計算する行列の次元数は、両端で6、両端以外で7となります。
通常のスプライン補間計算だと行列の次元数は100となるのに比べて、より少ない計算数にすることが可能です。
もちろんデメリットとして、通常のスプライン補間に対して補間の精度が下がると思われますが、分割点数を5以上にすればほとんど結果に違いはありません。
<実行サンプル>
https://drive.google.com/drive/folders/1xp6_RzYYCeVkCNc3anCqmjnAowVhHGbJ?usp=sharing
<プロシージャ紹介>
プロシージャ名:SplineXYParaFast
種類:Functionプロシージャ
機能:パラメトリック関数形式でスプライン補間を高速で行う。
機能:
引数
ArrayXY2D・・・補間対象となるX,Yの値が格納された二次元配列。1列目がX,2列目がY。
BunkatuN・・・パラメトリック関数の分割個数。補間位置個数は(BunkatuN+1)となる。この値が大きいほどより細かい補間となる。
PointCount・・・高速化のための分割の一区画点数。値は5が目安。
返り値・・・補間後の点X,Yが入った二次元配列。1列目がX,2列目がY値。
<使い方>
実行サンプルの中身をそのまま持ってきています。
サンプルの中身は以下のようになっています。
「Test実行」「初期化」「VBE起動」の3つのボタンが設置してあります。

D7:E206セルにXY座標の値が入っていて、この点がスプライン補間の補間対象の点となります。点数は200点になります。
このXY座標は右側の散布図に青い点で描画されています。
K5セルに補間位置個数を入力します。
「Test実行」ボタンを押すと、D7:E206セルのXY座標のスプライン補間結果がG7:H7セル以下に出力されます。
G7:H7セル以下に出力された計算結果は右側のオレンジの点で散布図に描画されます。

K5セルに入力する補間位置個数を増やすほど、より細かい補間が可能となります。
下図では10000点で出力しています。

「VBE起動」ボタンを押すと、「Test実行」に登録してあるコードが表示されます。
このコード内でSplineXYParaFastプロシージャが使われています。

<コード>

コメント