未能使用Ruby GSL解决简单的最小二乘拟合

时间:2015-07-17 04:24:47

标签: ruby gsl least-squares

我有以下ruby脚本,在ruby-2.2.1下使用rb-gsl(1.16.0.6)运行

require("gsl")
include GSL

m = GSL::Matrix::alloc([0.18, 0.60, 0.57], [0.24, 0.99, 0.58],
                [0.14, 0.30, 0.97], [0.51,  0.19, 0.85], [0.34, 0.91, 0.18])

B = GSL::Vector[1, 2, 3, 4, 5]
qr, tau = m.QR_decomp
x, res = qr.QR_lssolve(tau,B)

产生的错误是:

  

testls.rb:9:在QR_lssolve中:Ruby / GSL错误代码19,矩阵大小必须匹配>解决方案大小(文件qr.c,第193行),矩阵/向量大小不符合   (GSL ::错误:: EBADLEN)     来自testls.rb:9:in

我认为我的矩阵对于过度确定的LS问题具有正确的维度,因此我无法理解错误消息。

在Matlab中,我可以写:

m=[[0.18, 0.60, 0.57]; [0.24, 0.99, 0.58];...
        [0.14, 0.30, 0.97]; [0.51,  0.19, 0.85]; [0.34, 0.91, 0.18]];
B=[1, 2, 3, 4, 5]';

x=m\B

并获取

x =

8.0683
0.8844
0.2319

我想使矩阵/矢量大小符合要求并仍然表达一个过分确定的问题。从GSL文档中可以看出

 gsl_linalg_QR_lssolve (const gsl_matrix * QR, const gsl_vector * tau, const
 gsl_vector * b, gsl_vector * x, gsl_vector * residual) 

非常适合手头的任务,因此破坏了对Ruby的绑定还是我对正确用法的理解?所有帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题:似乎你必须预先为解决方案x和残差分配矢量并将它们作为参数传递:

require("gsl")
include GSL

m = GSL::Matrix::alloc([0.18, 0.60, 0.57], [0.24, 0.99, 0.58],
                [0.14, 0.30, 0.97], [0.51,  0.19, 0.85], [0.34, 0.91, 0.18])

B = GSL::Vector[1, 2, 3, 4, 5]
qr, tau = m.QR_decomp
x = GSL::Vector.alloc(3)
r = GSL::Vector.alloc(5)
qr.QR_lssolve(tau,B,x,r)

p x

这确实产生了

GSL::Vector
[ 8.068e+00 8.844e-01 2.319e-01 ]

查尔斯。