MATLAB プログラムを C++ に移植しようとしています。A
そして、行列と列ベクトルの間の左行列除算を実装したいと思いますB
。
A
は次と等しくないm-by-n
行列で、成分を持つ列ベクトルです。m
n
B
m
そして、その結果X = A\B
が過決定または過決定の方程式系に対する最小二乗法での解であることを望みAX = B
ます。つまり、ベクトルの長さをX
最小化します。つまり、MATLAB と同じ結果が得られるようにする必要があります。norm(A*X - B)
AX - B
A\B
この機能を GSL-GNU (GNU Science Library) に実装したいのですが、数学、最小二乗法、行列演算についてあまり知りません。GSL でこれを行う方法を教えてもらえますか? または、GSL での実装が複雑すぎる場合、上記の行列演算を提供する優れたオープン ソースの C/C++ ライブラリを提案してもらえますか?
さて、さらに5時間費やした後、ようやく自分で理解しました..しかし、それでも私の質問への提案に感謝します。
5 * 2 の行列があるとします。
A = [1 0
1 0
0 1
1 1
1 1]
とベクトルb = [1.8388,2.5595,0.0462,2.1410,0.6750]
の解決策A \ b
は
#include <stdio.h>
#include <gsl/gsl_linalg.h>
int
main (void)
{
double a_data[] = {1.0, 0.0,1.0, 0.0, 0.0,1.0,1.0,1.0,1.0,1.0};
double b_data[] = {1.8388,2.5595,0.0462,2.1410,0.6750};
gsl_matrix_view m
= gsl_matrix_view_array (a_data, 5, 2);
gsl_vector_view b
= gsl_vector_view_array (b_data, 5);
gsl_vector *x = gsl_vector_alloc (2); // size equal to n
gsl_vector *residual = gsl_vector_alloc (5); // size equal to m
gsl_vector *tau = gsl_vector_alloc (2); //size equal to min(m,n)
gsl_linalg_QR_decomp (&m.matrix, tau); //
gsl_linalg_QR_lssolve(&m.matrix, tau, &b.vector, x, residual);
printf ("x = \n");
gsl_vector_fprintf (stdout, x, "%g");
gsl_vector_free (x);
gsl_vector_free (tau);
gsl_vector_free (residual);
return 0;
}