1. 程式人生 > 實用技巧 >General matrix representations for B-splines 論文理解

General matrix representations for B-splines 論文理解

這篇論文 [1] 比較基礎,在很多與 B 樣條有關的論文中都能找到對它的引用。

B 樣條曲線是引數方程,使用引數 \(t\) 的多項式表達連續曲線。

多項式的計算是遞迴計算的,k 階 B 樣條的多項式的引數是 k 階的,需要從 k-1 階引數計算。可以看回形針視訊 [2] 有一個簡單的認識。

注意一下 spline 的 degree 與 order。對於多項式而言 degree 與 order 是相等的,是同義詞。而對於 spline,order = degree + 1。[3]

B-splines of order \(p+1\) are connected piece-wise polynomial functions of degree \(p\)

.

所以在 [2] 中提到的 “4 個控制點 3 次 B 樣條”的 order 為 4,degree 為 3。B 樣條上的任意一點受到 order 個控制點的影響,可以看做是 3 次多項式。

作者在這篇論文提出了一種 B 樣條曲線使用 Matrix 表達的方式,這種方式在計算上有優勢。

回想到斐波那契數列,也是遞迴計算,其中有一種計算方式也是用矩陣表達[4]。甚至可以從這個矩陣的表達中得出斐波那契數列的通項公式。

以下正文中的公式引用使用兩種形式:本文的公式,如(1);原文 [1] 的公式,如(1*)。

以下推導過程應該會很囉嗦,我的目的是我自己能夠看得懂,通過此文能夠毫不費力地瞭解到論文中所有沒有明說的細節。

1. Toeplitz Matrix 表達多項式

Toeplitz Matrix 的定義在 [1] 中有,2.1 的第一句話。

The Toeplitz matrix is one whose elements on any line parallel to the main diagonal are all equal.

如果 Toeplitz Matrix 是一個 lower triangular matrix 的話,它就能表達一個多項式。我嘗試用二次型的方式去解釋這個矩陣,但是失敗了。反正 [2] 2.1 的第二個矩陣 \(\mathbf{T}\) 可以表示一個多項式。

\[\begin{align} f(x) = a_0 + a_1 x + a_x x^2 + \dots + a_{n-1} x^{n-1} (a_{n-1} \neq 0) \end{align}\]

你問我這個 \(\mathbf{T}\) 是多少維的方陣,我也不知道,按需構建。這不重要。重點在 [1] 2.2 對它的應用中。

假設有兩個多項式。

\[\begin{align} g(x) &= c_0 + c_1 x + c_x x^2 + \dots + c_{m-1} x^{m-1} (c_{m-1} \neq 0) \\ q(x) &= d_0 + d_1 x + d_x x^2 + \dots + d_{n-1} x^{n-1} (d_{n-1} \neq 0) \end{align}\]

\(f(x) = g(x) q(x)\)\(f(x)\) 的最高次應當是 \(m + n - 2\)

所以 [1] 2.2 中的矩陣具體的維數應當如下。

\[\begin{align} f(x) &= g(x) q(x) \\ &= \mathbf{X} \begin{bmatrix} c_0 & \phantom{} & \phantom{} & \phantom{} & \phantom{} & \phantom{} & 0 \\ c_1 & c_0 \\ \vdots & \ddots & \ddots \\ c_{m - 1} & \cdots & \ddots \\ \phantom{} & \ddots & \cdots & \ddots & \ddots \\ \phantom{} & \phantom{} & c_{m-1} & \cdots & \ddots & c_0 \\ 0 & \phantom{} & \phantom{} & c_{m-1} & \cdots & c_1 & c_0 \end{bmatrix}_{(m + n - 1) \times (m + n - 1)} \begin{bmatrix} d_0 \\ d_1 \\ \vdots \\ d_{n - 1} \\ 0 \\ \vdots \\ 0 \end{bmatrix}_{(m + n - 1) \times 1} \\ &= \mathbf{X} \begin{bmatrix} c_0 & \phantom{} & \phantom{} & 0 \\ c_1 & c_0 \\ \vdots & \ddots & \ddots \\ \vdots & \ddots & \ddots & c_0\\ \vdots & \ddots & \ddots & \vdots\\ c_{m - 1} & c_{m-2} & \cdots & c_{m-n} \\ \phantom{} & \ddots & \cdots & \vdots \\ \phantom{} & \phantom{} & c_{m-1} & c_{m-2} \\ 0 & \phantom{} & \phantom{} & c_{m-1} \end{bmatrix}_{(m + n - 1) \times n} \begin{bmatrix} d_0 \\ d_1 \\ \vdots \\ d_{n - 1} \end{bmatrix}_{n \times 1} \end{align}\]

[5] 給了一個具體的例子,可以看一下。

2. Toeplitz Matrix 表達 B 樣條的 basis functions

我對 B 樣條不熟,各種亂七八糟的多項式,不清晰。希望看完這個能夠清晰一些。

(1*) 給出了 B 樣條各階 basis function 的遞迴公式。

作者說 By means of basis translation from B-spline to power basis, ...,所以 basis function 就從以引數 \(t\) 作為變數,轉換到以 \(u\) 作為變數。作者說參考的兩個參考文獻都是書,而且其中的 Practical Guide to Splines 還只能找到掃描版。不容易搜尋關鍵字 power basis。所以我另外找了一篇參考文獻 [6],也是 De Boor 寫的。看 [6] 的 8. Condition,是精度的問題,用 power basis 轉換變數的取值空間能夠更容易控制精度。注意 Condition 這個詞,聯想到了 Matrix Condition Number([7] 2.2.2 與 4.3.2)。Matrix 用於表示一個線性系統,Condition Number 表示 forward error / backward error,forward error 是 x 的誤差,而 backward error 是 f(x) 的誤差。希望 condition number 儘可能小,即 f(x) 是觀察值,用觀察值去估計實際關心的狀態值 x,希望觀察值小的抖動,只會造成狀態值小的抖動,這樣就容許了觀察值的觀測誤差,對測量條件沒有這麼苛刻。[6] 的 8. Condition 也是這個意思。

\[\begin{align} B_{j,k}(t) &= {t - t_j \over t_{j + k - 1} - t_j} B_{j,k-1}(t) + {t_{j + k} - t \over t_{j + k} - t_{j + 1}} B_{j + 1, k -1}(t) \\ &= ({t_i - t_j \over t_{j + k - 1} - t_j} + {t - t_i \over t_{i + 1} - t_i}{t_{i + 1} - t_i \over t_{j + k - 1} - t_j}) B_{j,k-1}(t) \\ &\phantom{=} + ({t_{j + k} - t_i \over t_{j + k} - t_{j + 1}} - {t - t_i \over t_{i + 1} - t_i}{t_{i + 1} - t_i \over t_{j + k} - t_{j + 1}}) B_{j + 1, k -1}(t) \\ B_{j,k}(u) &= (d_{0,j} + ud_{1,j}) B_{j,k-1}(u) + (h_{0,j} + uh_{1,j}) B_{j + 1, k -1}(u) \\ u &= {t - t_i \over t_{i+1} - t_i}, u\in [0, 1) \end{align}\]

上式中出現的 index \(i\) 是什麼意思?公式 (3*) 上方的文字做了解釋,\(i\) 表示當前關注的 \(t\in[t_i,t_{i+1})\),這個區間內的 B 樣條與周圍 \(k\) 個 basis functions 以及它們對應的 control points 有關,\(j\) 是這 \(k\) 個部分的 index。

作者給出 \(B_{j,k-1}(u)\) 的定義。

\[\begin{align} B_{j,k-1}(u) &= \begin{bmatrix} 1 & u & \dots & u^{k-2} \end{bmatrix} \begin{bmatrix} N_{0,j}^{k-1} \\ N_{1,j}^{k-1} \\ \vdots \\ N_{k-2,j}^{k-1} \end{bmatrix} \\ u &= {t - t_i \over t_{i+1} - t_i}, u\in [0, 1) \end{align}\]

用 Toeplitz Matrix 表示這個迭代過程,\(u\)\(k-2\) 此上升到 \(k-1\) 次。

\[\begin{align} B_{j,k}(u) &= (d_{0,j} + ud_{1,j}) B_{j,k-1}(u) + (h_{0,j} + uh_{1,j}) B_{j + 1, k -1}(u) \\ &= \begin{bmatrix} 1 & u & \dots & u^{k-1} \end{bmatrix} \left\{ \begin{bmatrix} N_{0,j}^{k-1} & 0 \\ N_{1,j}^{k-1} & N_{0,j}^{k-1} \\ \vdots & N_{1,j}^{k-1} \\ N_{k-2,j}^{k-1} & \vdots \\ 0 & N_{k-2,j}^{k-1} \end{bmatrix} \begin{bmatrix} d_{0,j} \\ d_{1,j} \end{bmatrix} + \begin{bmatrix} N_{0,j+1}^{k-1} & 0 \\ N_{1,j+1}^{k-1} & N_{0,j+1}^{k-1} \\ \vdots & N_{1,j+1}^{k-1} \\ N_{k-2,j+1}^{k-1} & \vdots \\ 0 & N_{k-2,j+1}^{k-1} \end{bmatrix} \begin{bmatrix} h_{0,j} \\ h_{1,j} \end{bmatrix} \right\} \end{align}\]

如公式 (4*),在 \(t\in[t_i,t_{i+1})\) 這個區間內,點的座標可以寫作。

\[\begin{align} \mathbf{c}_{i-k+1} &= \begin{bmatrix} B_{i-k+1,k}(u) & B_{i-k+2,k}(u) & \cdots & B_{i,k}(u) \end{bmatrix} \times \begin{bmatrix} \mathbf{V}_{i-k+1} \\ \mathbf{V}_{i-k+2} \\ \vdots \\ \mathbf{V}_{i} \end{bmatrix} \end{align}\]

\(k\) 個 basis function 都是 \(k-1\) 次的。擴充套件開。

\[\begin{align} &\phantom{=}\begin{bmatrix} B_{i-k+1,k}(u) & B_{i-k+2,k}(u) & \cdots & B_{i,k}(u) \end{bmatrix} \\ &= \begin{bmatrix} 1 & u & \dots & u^{k-1} \end{bmatrix} \mathbf{M}^k(i) \\ \mathbf{M}^k(i) &= \begin{bmatrix} N_{0,i-k+1}^{k} & N_{0,i-k+2}^{k} & \dots & N_{0,i}^{k} \\ N_{1,i-k+1}^{k} & N_{1,i-k+2}^{k} & \dots & N_{1,i}^{k} \\ \vdots & \vdots & & \vdots \\ N_{k-1,i-k+1}^{k} & N_{k-1,i-k+2}^{k} & \dots & N_{k-1,i}^{k} \end{bmatrix} \end{align}\]

所以,B 樣條公式的關注重點在 \(\mathbf{M}^k(i)\)\(\mathbf{M}^k(i)\) 是變化的部分,其他部分相對固定。

3. \(\mathbf{M}^k(i)\) 的迭代計算

\(\mathbf{M}^k(i)\) 第 1 列。

\[\begin{align} \begin{bmatrix} N_{0,i-k+1}^{k} \\ N_{1,i-k+1}^{k} \\ \vdots \\ \vdots \\ N_{k-1,i-k+1}^{k} \end{bmatrix} &= \begin{bmatrix} N_{0,i-k+1}^{k-1} & 0 \\ N_{1,i-k+1}^{k-1} & N_{0,i-k+1}^{k-1} \\ \vdots & N_{1,i-k+1}^{k-1} \\ N_{k-2,i-k+1}^{k-1} & \vdots \\ 0 & N_{k-2,i-k+1}^{k-1} \end{bmatrix} \begin{bmatrix} d_{0,i-k+1} \\ d_{1,i-k+1} \end{bmatrix} + \begin{bmatrix} N_{0,i-k+2}^{k-1} & 0 \\ N_{1,i-k+2}^{k-1} & N_{0,i-k+2}^{k-1} \\ \vdots & N_{1,i-k+2}^{k-1} \\ N_{k-2,i-k+2}^{k-1} & \vdots \\ 0 & N_{k-2,i-k+2}^{k-1} \end{bmatrix} \begin{bmatrix} h_{0,i-k+1} \\ h_{1,i-k+1} \end{bmatrix} \end{align}\]

\(\mathbf{M}^k(i)\) 可以每一列分別計算再求和,記得補 \(\mathbf{0}\) 列。

\[\begin{align} \begin{bmatrix} N_{0,i-k+1}^{k} & \overbrace{0 \cdots 0}^{k-1} \\ N_{1,i-k+1}^{k} & 0 \cdots 0 \\ \vdots & \vdots \\ \vdots & \vdots \\ N_{k-1,i-k+1}^{k} & 0 \cdots 0 \end{bmatrix} &= \begin{bmatrix} N_{0,i-k+1}^{k-1} & 0 \\ N_{1,i-k+1}^{k-1} & N_{0,i-k+1}^{k-1} \\ \vdots & N_{1,i-k+1}^{k-1} \\ N_{k-2,i-k+1}^{k-1} & \vdots \\ 0 & N_{k-2,i-k+1}^{k-1} \end{bmatrix} \begin{bmatrix} d_{0,i-k+1} & \overbrace{0 \cdots 0}^{k-1} \\ d_{1,i-k+1} & 0 \cdots 0 \end{bmatrix} + \begin{bmatrix} N_{0,i-k+2}^{k-1} & 0 \\ N_{1,i-k+2}^{k-1} & N_{0,i-k+2}^{k-1} \\ \vdots & N_{1,i-k+2}^{k-1} \\ N_{k-2,i-k+2}^{k-1} & \vdots \\ 0 & N_{k-2,i-k+2}^{k-1} \end{bmatrix} \begin{bmatrix} h_{0,i-k+1} & \overbrace{0 \cdots 0}^{k-1} \\ h_{1,i-k+1} & 0 \cdots 0 \end{bmatrix} \end{align}\]

下面使用了矩陣分塊。

\[\begin{align} \mathbf{M}^k(i) &= \begin{bmatrix} N_{0,i-k+1}^{k} & N_{0,i-k+2}^{k} & \dots & N_{0,i}^{k} \\ N_{1,i-k+1}^{k} & N_{1,i-k+2}^{k} & \dots & N_{1,i}^{k} \\ \vdots & \vdots & & \vdots \\ N_{k-1,i-k+1}^{k} & N_{k-1,i-k+2}^{k} & \dots & N_{k-1,i}^{k} \end{bmatrix} \\ &= \begin{bmatrix} N_{0,i-k+1}^{k} & 0 & \dots & 0 \\ N_{1,i-k+1}^{k} & 0 & \dots & 0 \\ \vdots & \vdots & & \vdots \\ N_{k-1,i-k+1}^{k} & 0 & \dots & 0 \end{bmatrix} + \begin{bmatrix} 0 & N_{0,i-k+2}^{k} & \dots & 0 \\ 0 & N_{1,i-k+2}^{k} & \dots & 0 \\ \vdots & \vdots & & \vdots \\ 0 & N_{k-1,i-k+2}^{k} & \dots & 0 \end{bmatrix} + \cdots + \begin{bmatrix} 0 & 0 & \dots & N_{0,i}^{k} \\ 0 & 0 & \dots & N_{1,i}^{k} \\ \vdots & \vdots & & \vdots \\ 0 & 0 & \dots & N_{k-1,i}^{k} \end{bmatrix} \\ &= \begin{bmatrix} N_{0,i-k+1}^{k-1} & 0 \\ N_{1,i-k+1}^{k-1} & N_{0,i-k+1}^{k-1} \\ \vdots & N_{1,i-k+1}^{k-1} \\ N_{k-2,i-k+1}^{k-1} & \vdots \\ 0 & N_{k-2,i-k+1}^{k-1} \end{bmatrix} \begin{bmatrix} d_{0,i-k+1} & \overbrace{0 \cdots 0}^{k-1} \\ d_{1,i-k+1} & 0 \cdots 0 \end{bmatrix} + \begin{bmatrix} N_{0,i-k+2}^{k-1} & 0 \\ N_{1,i-k+2}^{k-1} & N_{0,i-k+2}^{k-1} \\ \vdots & N_{1,i-k+2}^{k-1} \\ N_{k-2,i-k+2}^{k-1} & \vdots \\ 0 & N_{k-2,i-k+2}^{k-1} \end{bmatrix} \begin{bmatrix} 0 & d_{0,i-k+2} & \overbrace{0 \cdots 0}^{k-2} \\ 0 & d_{1,i-k+2} & 0 \cdots 0 \end{bmatrix} \\ &+ \cdots + \begin{bmatrix} N_{0,i}^{k-1} & 0 \\ N_{1,i}^{k-1} & N_{0,i}^{k-1} \\ \vdots & N_{1,i}^{k-1} \\ N_{k-2,i}^{k-1} & \vdots \\ 0 & N_{k-2,i}^{k-1} \end{bmatrix} \begin{bmatrix} \overbrace{0 \cdots 0}^{k-1} & d_{0,i} \\ 0 \cdots 0 & d_{1,i} \end{bmatrix} \\ &+ \begin{bmatrix} N_{0,i-k+2}^{k-1} & 0 \\ N_{1,i-k+2}^{k-1} & N_{0,i-k+2}^{k-1} \\ \vdots & N_{1,i-k+2}^{k-1} \\ N_{k-2,i-k+2}^{k-1} & \vdots \\ 0 & N_{k-2,i-k+2}^{k-1} \end{bmatrix} \begin{bmatrix} h_{0,i-k+1} & \overbrace{0 \cdots 0}^{k-1} \\ h_{1,i-k+1} & 0 \cdots 0 \end{bmatrix} + \begin{bmatrix} N_{0,i-k+3}^{k-1} & 0 \\ N_{1,i-k+3}^{k-1} & N_{0,i-k+3}^{k-1} \\ \vdots & N_{1,i-k+3}^{k-1} \\ N_{k-2,i-k+3}^{k-1} & \vdots \\ 0 & N_{k-2,i-k+3}^{k-1} \end{bmatrix} \begin{bmatrix} 0 & h_{0,i-k+2} & \overbrace{0 \cdots 0}^{k-2} \\ 0 & h_{1,i-k+2} & 0 \cdots 0 \end{bmatrix} \\ &+ \cdots + \begin{bmatrix} N_{0,i+1}^{k-1} & 0 \\ N_{1,i+1}^{k-1} & N_{0,i+1}^{k-1} \\ \vdots & N_{1,i+1}^{k-1} \\ N_{k-2,i+1}^{k-1} & \vdots \\ 0 & N_{k-2,i+1}^{k-1} \end{bmatrix} \begin{bmatrix} \overbrace{0 \cdots 0}^{k-1} & h_{0,i} \\ 0 \cdots 0 & h_{1,i} \end{bmatrix} \\ &= \begin{bmatrix} N_{0,i-k+1}^{k-1} & 0 \\ N_{1,i-k+1}^{k-1} & N_{0,i-k+1}^{k-1} \\ \vdots & N_{1,i-k+1}^{k-1} \\ N_{k-2,i-k+1}^{k-1} & \vdots \\ 0 & N_{k-2,i-k+1}^{k-1} \end{bmatrix} \begin{bmatrix} d_{0,i-k+1} & \overbrace{0 \cdots 0}^{k-1} \\ d_{1,i-k+1} & 0 \cdots 0 \end{bmatrix} \\ &+ \begin{bmatrix} N_{0,i-k+2}^{k-1} & 0 \\ N_{1,i-k+2}^{k-1} & N_{0,i-k+2}^{k-1} \\ \vdots & N_{1,i-k+2}^{k-1} \\ N_{k-2,i-k+2}^{k-1} & \vdots \\ 0 & N_{k-2,i-k+2}^{k-1} \end{bmatrix} \begin{bmatrix} h_{0,i-k+1} & d_{0,i-k+2} & \overbrace{0 \cdots 0}^{k-2} \\ h_{1,i-k+1} & d_{1,i-k+2} & 0 \cdots 0 \end{bmatrix} \\ &+ \begin{bmatrix} N_{0,i-k+3}^{k-1} & 0 \\ N_{1,i-k+3}^{k-1} & N_{0,i-k+3}^{k-1} \\ \vdots & N_{1,i-k+3}^{k-1} \\ N_{k-2,i-k+3}^{k-1} & \vdots \\ 0 & N_{k-2,i-k+3}^{k-1} \end{bmatrix} \begin{bmatrix} 0 & h_{0,i-k+2} & d_{0,i-k+3} & \overbrace{0 \cdots 0}^{k-3} \\ 0 & h_{1,i-k+2} & d_{1,i-k+3} & 0 \cdots 0 \end{bmatrix} \\ &+ \cdots \\ &+ \begin{bmatrix} N_{0,i}^{k-1} & 0 \\ N_{1,i}^{k-1} & N_{0,i}^{k-1} \\ \vdots & N_{1,i}^{k-1} \\ N_{k-2,i}^{k-1} & \vdots \\ 0 & N_{k-2,i}^{k-1} \end{bmatrix} \begin{bmatrix} \overbrace{0 \cdots 0}^{k-2} & h_{0,i-1} & d_{0,i} \\ 0 \cdots 0 & h_{1,i-1} & d_{1,i} \end{bmatrix} \\ &+ \begin{bmatrix} N_{0,i+1}^{k-1} & 0 \\ N_{1,i+1}^{k-1} & N_{0,i+1}^{k-1} \\ \vdots & N_{1,i+1}^{k-1} \\ N_{k-2,i+1}^{k-1} & \vdots \\ 0 & N_{k-2,i+1}^{k-1} \end{bmatrix} \begin{bmatrix} \overbrace{0 \cdots 0}^{k-1} & h_{0,i} \\ 0 \cdots 0 & h_{1,i} \end{bmatrix} \\ &=^{(**)} \begin{bmatrix} N_{0,i-k+2}^{k-1} \\ N_{1,i-k+2}^{k-1} \\ \vdots \\ N_{k-2,i-k+2}^{k-1} \\ 0 \end{bmatrix} \begin{bmatrix} h_{0,i-k+1} & d_{0,i-k+2} & \overbrace{0 \cdots 0}^{k-2} \end{bmatrix} + \begin{bmatrix} 0 \\ N_{0,i-k+2}^{k-1} \\ N_{1,i-k+2}^{k-1} \\ \vdots \\ N_{k-2,i-k+2}^{k-1} \end{bmatrix} \begin{bmatrix} h_{1,i-k+1} & d_{1,i-k+2} & \overbrace{0 \cdots 0}^{k-2} \end{bmatrix} \\ &+ \begin{bmatrix} N_{0,i-k+3}^{k-1} \\ N_{1,i-k+3}^{k-1} \\ \vdots \\ N_{k-2,i-k+3}^{k-1} \\ 0 \end{bmatrix} \begin{bmatrix} 0 & h_{0,i-k+2} & d_{0,i-k+3} & \overbrace{0 \cdots 0}^{k-3} \end{bmatrix} + \begin{bmatrix} 0 \\ N_{0,i-k+3}^{k-1} \\ N_{1,i-k+3}^{k-1} \\ \vdots \\ N_{k-2,i-k+3}^{k-1} \end{bmatrix} \begin{bmatrix} 0 & h_{1,i-k+2} & d_{1,i-k+3} & \overbrace{0 \cdots 0}^{k-3} \end{bmatrix} \\ &+ \cdots \\ &+ \begin{bmatrix} N_{0,i}^{k-1} \\ N_{1,i}^{k-1} \\ \vdots \\ N_{k-2,i}^{k-1} \\ 0 \end{bmatrix} \begin{bmatrix} \overbrace{0 \cdots 0}^{k-2} & h_{0,i-1} & d_{0,i} \end{bmatrix} + \begin{bmatrix} 0 \\ N_{0,i}^{k-1} \\ N_{1,i}^{k-1} \\ \vdots \\ N_{k-2,i}^{k-1} \end{bmatrix} \begin{bmatrix} \overbrace{0 \cdots 0}^{k-2} & h_{1,i-1} & d_{1,i} \end{bmatrix} \\ &= \begin{bmatrix} N_{0,i-k+2}^{k-1} & N_{0,i-k+3}^{k-1} & \cdots & N_{0,i}^{k-1} \\ N_{1,i-k+2}^{k-1} & N_{1,i-k+3}^{k-1} & \cdots & N_{1,i}^{k-1} \\ \vdots & \vdots & & \vdots \\ N_{k-2,i-k+2}^{k-1} & N_{k-2,i-k+3}^{k-1} & \cdots & N_{k-2,i}^{k-1} \\ 0 & 0 & \cdots & 0 \end{bmatrix} \begin{bmatrix} h_{0,i-k+1} & d_{0,i-k+2} & & & 0 \\ & h_{0,i-k+2} & d_{0,i-k+3} & & \\ & & \ddots & \ddots & \\ 0 & & & h_{0,i-1} & d_{0,i} \\ \end{bmatrix} \\ &+ \begin{bmatrix} 0 & 0 & \cdots & 0 \\ N_{0,i-k+2}^{k-1} & N_{0,i-k+3}^{k-1} & \cdots & N_{0,i}^{k-1} \\ N_{1,i-k+2}^{k-1} & N_{1,i-k+3}^{k-1} & \cdots & N_{1,i}^{k-1} \\ \vdots & \vdots & & \vdots \\ N_{k-2,i-k+2}^{k-1} & N_{k-2,i-k+3}^{k-1} & \cdots & N_{k-2,i}^{k-1} \end{bmatrix} \begin{bmatrix} h_{1,i-k+1} & d_{1,i-k+2} & & & 0 \\ & h_{1,i-k+2} & d_{1,i-k+3} & & \\ & & \ddots & \ddots & \\ 0 & & & h_{1,i-1} & d_{1,i} \\ \end{bmatrix} \\ &= \begin{bmatrix} \mathbf{M}^{k-1}(i) \\ \mathbf{0}^T \end{bmatrix} \begin{bmatrix} h_{0,i-k+1} & d_{0,i-k+2} & & & 0 \\ & h_{0,i-k+2} & d_{0,i-k+3} & & \\ & & \ddots & \ddots & \\ 0 & & & h_{0,i-1} & d_{0,i} \\ \end{bmatrix} \\ &+ \begin{bmatrix} \mathbf{0}^T \\ \mathbf{M}^{k-1}(i) \end{bmatrix} \begin{bmatrix} h_{1,i-k+1} & d_{1,i-k+2} & & & 0 \\ & h_{1,i-k+2} & d_{1,i-k+3} & & \\ & & \ddots & \ddots & \\ 0 & & & h_{1,i-1} & d_{1,i} \\ \end{bmatrix} \\ &= \begin{bmatrix} \mathbf{M}^{k-1}(i) \\ \mathbf{0}^T \end{bmatrix} \begin{bmatrix} 1-d_{0,i-k+2} & d_{0,i-k+2} & & & 0 \\ & 1-d_{0,i-k+3} & d_{0,i-k+3} & & \\ & & \ddots & \ddots & \\ 0 & & & 1-d_{0,i} & d_{0,i} \\ \end{bmatrix} \\ &+ \begin{bmatrix} \mathbf{0}^T \\ \mathbf{M}^{k-1}(i) \end{bmatrix} \begin{bmatrix} -d_{1,i-k+2} & d_{1,i-k+2} & & & 0 \\ & -d_{1,i-k+3} & d_{1,i-k+3} & & \\ & & \ddots & \ddots & \\ 0 & & & -d_{1,i} & d_{1,i} \\ \end{bmatrix} \end{align}\]

(**): 為什麼第一項與最後一項都為 0?這個等號前方的式子第一項與最後一項的“\(N\) 的部分”分別是 \(B_{i-k+1,k-1}(u), B_{i+1,k-1}(u)\) 的係數部分,是 \(k-1\) 階的係數。結合公式 (3*),知道 \(k\) 階的區間涉及範圍是 \([i-k+1, i]\)。所以 \(k-1\) 階的區間涉及範圍是 \([i-k+2, i]\),沒有包含 \(i-k+1,i+1\),所以在 \(k-1\) 階時這兩項為 0。

\(\mathbf{M}^k(i)\) 的初始值,一階只含有一個 \(N^1_{0,i}\)\(\mathbf{M}^1(i)=\begin{bmatrix}1\end{bmatrix}\),即常值函式。

4. Uniform B-splines 的 \(\mathbf{M}^k(i)\) 通項公式

Uniform B-splines 的每一個區間的長度相等,假設為 1。可以將 \(\mathbf{M}^k(i)\)\(d_{0,*}, d_{1,*}\) 寫成分數,並且與 \(i\) 無關係,所以不管有多少結點,都只用算一次 \(\mathbf{M}^k(i)\),也就可以直接寫作 \(\mathbf{M}^k\)。得到的結果如公式 (7*)。

\[\begin{align} \mathbf{M}^k &= {1 \over k-1} \left\{ \begin{bmatrix} \mathbf{M}^{k-1} \\ \mathbf{0}^T \end{bmatrix} \begin{bmatrix} 1 & k-2 & & & 0 \\ & 2 & k-3 & & \\ & & \ddots & \ddots & \\ 0 & & & k-1 & 0 \\ \end{bmatrix} + \begin{bmatrix} \mathbf{0}^T \\ \mathbf{M}^{k-1} \end{bmatrix} \begin{bmatrix} -1 & 1 & & & 0 \\ & -1 & 1 & & \\ & & \ddots & \ddots & \\ 0 & & & -1 & 1 \\ \end{bmatrix} \right\} \end{align}\]

通項公式怎麼計算,我不知道。

論文之後計算了一些偏導,但是符號系統實在讓人看不懂。需要用的時候自然能推匯出。

Reference

[1] Qin, Kaihuai. "General matrix representations for B-splines." The Visual Computer 16.3-4 (2000): 177-186.

[2] 【回形針PaperClip】如何設計一個逼真的三維模型
.

[3] Wikipedia: De Boor's algorithm.

[4] Wikipedia: Fibonacci number 3.3 Matrix form.

[5] Unknown: Matrixces and Polynomials.

[6] De Boor, Carl. B (asic)-Spline Basics. No. MRC-TSR-2952. WISCONSIN UNIV-MADISON MATHEMATICS RESEARCH CENTER, 1986.

[7] Solomon, Justin. Numerical algorithms: methods for computer vision, machine learning, and graphics. CRC press, 2015.