我正在尝试将 MATLAB 程序移植到 C++。我想在矩阵A
和列向量之间实现左矩阵除法B
。
A
是一个不等于的m-by-n
矩阵,并且是一个带有分量的列向量。m
n
B
m
我希望结果X = A\B
是对方程组的欠定或超定系统的最小二乘解AX = B
。换句话说,X
最小化norm(A*X - B)
,向量的长度AX - B
。A\B
这意味着我希望它具有与MATLAB中相同的结果。
我想在 GSL-GNU(GNU 科学图书馆)中实现这个功能,但我对数学、最小二乘拟合或矩阵运算知之甚少,有人能告诉我如何在 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;
}