これは古典的な線形代数の問題であり、検索するキーワードは「重回帰」です。
私は何年にもわたってこれのいくつかのバリエーションを何度もコーディングしなければなりませんでした。たとえば、デジタイザータブレットまたはスタイラスのタッチスクリーンを調整するコードは、同じ計算を使用します。
これが数学です:
pを入力ベクトル、qを対応する出力ベクトルとします。
必要な変換は3x3行列です。それをAと呼びます。
単一の入力および出力ベクトルpおよびqの場合、エラーベクトルeがあります。
e = q - A x p
エラーの大きさの2乗は、スカラー値です。
e T x e =(q - A x p)T x(q - A x p)
(T演算子が転置されている場合)。
本当に最小化したいのは、セット全体のe値の合計です。
E =合計(e)
この最小値は、行列方程式D =0を満たします。
D (i、j)= A(i、j)に関するEの偏導関数
N個の入力ベクトルと出力ベクトルがあるとします。
入力3ベクトルのセットは3xN行列です。この行列をPと呼びます。Pのi番目の列は、i番目の入力ベクトルです。
出力3ベクトルのセットも同様です。この行列をQと呼びます。
あなたがすべての代数を通して挽くとき、解決策は
A = Q x P T x(P x P T)^-1
(ここで、^-1は逆演算子です-上付き文字または下付き文字がないことについて申し訳ありません)
アルゴリズムは次のとおりです。
入力ベクトルのセットから3xN行列Pを作成します。
出力ベクトルのセットから3xN行列Qを作成します。
行列乗算 R = P x転置(P)
Rの逆数を計算します
行列乗算A = Q x転置(P)x逆行列(R)
選択した線形代数ライブラリの行列乗算および行列反転ルーチンを使用します。
ただし、3x3アフィン変換行列は、入力ベクトルをスケーリングおよび回転できますが、変換は実行できません。これはあなたの問題にとって十分に一般的ではないかもしれません。通常、3つのベクトルのそれぞれの最後に「1」を追加して4つのベクトルを作成し、エラーを最小限に抑える最適な3x4変換行列を探すことをお勧めします。これは害にはなりません。それはデータのより良い適合につながるだけです。